外观模式(Facade)C++实现
2024-08-31 08:31:12
外观模式
意图:
为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一系统更加容易使用。
适用性:
1、在设计初期阶段,应该要有意识的将不同的两个层分离,比如经典的三层架构,就需要考虑在数据访问层和业务逻辑层、业务逻辑层和表示层的层与层之间建立外观。
2、在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,大多数模式使用时也都会产生很多很小的类,这本是好事,但也给外部调用他们的用户程序带来了使用上的困难,用外观模式提供一个简单的接口,减少他们之间的依赖。
3、在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,但因为它包含非常重要的功能,新的需求开发必须要依赖于它。此时为新系统开发一个外观类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与外观对象交互,外观对象与遗留代码交互所有复杂的工作。
UML:
代码实现:
一家餐厅,如果没有服务员,那么饮料、餐具、纸巾什么的都得顾客自己去拿。
交互如图:
有了服务员,则顾客有什么事可以直接找服务员,这就是外观模式的体现。
交互如图:
代码:
#include <iostream>
using namespace std; class Gettableware{
public:
Gettableware(){}
void doIt()
{
cout<<"拿餐具!"<<endl;
}
}; class GetDrink{
public:
GetDrink(){}
void doIt()
{
cout<<"拿饮料!"<<endl;
}
}; class GetTissue{
public:
GetTissue(){}
void doIt()
{
cout<<"拿纸巾!"<<endl;
}
}; class Waiter{
public:
Waiter()
{
mpGettableware = new Gettableware;
mpGetDrink = new GetDrink;
mpGetTissue = new GetTissue;
} ~Waiter()
{
delete mpGetTissue;
delete mpGettableware;
delete mpGetDrink;
}
void mGettableware()
{
mpGettableware->doIt();
}
void mGetDrink()
{
mpGetDrink->doIt();
}
void mGetTissue()
{
mpGetTissue->doIt();
}
public:
Gettableware* mpGettableware;
GetDrink* mpGetDrink;
GetTissue* mpGetTissue;
}; class Client{
public:
Client()
{
mWaiter = new Waiter;
}
~Client()
{
delete mWaiter;
}
Waiter* mWaiter;
}; void main()
{
Client client;
client.mWaiter->mGettableware();
client.mWaiter->mGetDrink();
client.mWaiter->mGetTissue();
return;
}
最新文章
- 深入理解jsonp跨域请求原理
- c++ 成员函数
- android ant 自动编译打包
- 【转】cvs2svn 把CVS档案库转换为SVN档案库
- linux防火墙启动、停止、查看
- iOS监听电话事件
- 大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解
- java线程interrupt、interrupted 、isInterrupted区别
- Java线程的中断(Interruption)
- python集合set相关操作
- 设计模式学习心得<;代理模式 Proxy>;
- python3 列表/字典/集合推导式
- HttpServletResponse设置下载文件
- SpringMVC学习 十三 拦截器栈
- <;%@ include file=";";%>;与<;jsp:include page=";";/>;
- 三、synchronized同步锁
- angularjs与vue循环数组对象是区别
- 导出数据excel表--身份证号后三位是0--〉还原
- Appium Remote webdriver调用
- HDU 1029 Ignatius and the Princess IV (map的使用)
热门文章
- 【sqli-labs】 less36 GET- Bypass MYSQL_real_escape_string (GET型绕过MYSQL_real_escape_string的注入)
- GET 请求控制器 返回绑定后HTML
- php 加密解密函数封装
- 什么是Capability
- android的数据与访问(2)-delphi xe7如何存取我的app配置参数文件?
- 【Educational Codeforces Round 53 (Rated for Div. 2) C】Vasya and Robot
- Spring Boot-定义拦截器(七)
- BZOJ——T 1053: [HAOI2007]反素数ant
- HDU 4507
- 彻底解决Android GPS没法定位这一顽固问题