外观模式

意图:

为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一系统更加容易使用。

适用性:

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;
}

最新文章

  1. 深入理解jsonp跨域请求原理
  2. c++ 成员函数
  3. android ant 自动编译打包
  4. 【转】cvs2svn 把CVS档案库转换为SVN档案库
  5. linux防火墙启动、停止、查看
  6. iOS监听电话事件
  7. 大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解
  8. java线程interrupt、interrupted 、isInterrupted区别
  9. Java线程的中断(Interruption)
  10. python集合set相关操作
  11. 设计模式学习心得&lt;代理模式 Proxy&gt;
  12. python3 列表/字典/集合推导式
  13. HttpServletResponse设置下载文件
  14. SpringMVC学习 十三 拦截器栈
  15. &lt;%@ include file=&quot;&quot;%&gt;与&lt;jsp:include page=&quot;&quot;/&gt;
  16. 三、synchronized同步锁
  17. angularjs与vue循环数组对象是区别
  18. 导出数据excel表--身份证号后三位是0--〉还原
  19. Appium Remote webdriver调用
  20. HDU 1029 Ignatius and the Princess IV (map的使用)

热门文章

  1. 【sqli-labs】 less36 GET- Bypass MYSQL_real_escape_string (GET型绕过MYSQL_real_escape_string的注入)
  2. GET 请求控制器 返回绑定后HTML
  3. php 加密解密函数封装
  4. 什么是Capability
  5. android的数据与访问(2)-delphi xe7如何存取我的app配置参数文件?
  6. 【Educational Codeforces Round 53 (Rated for Div. 2) C】Vasya and Robot
  7. Spring Boot-定义拦截器(七)
  8. BZOJ——T 1053: [HAOI2007]反素数ant
  9. HDU 4507
  10. 彻底解决Android GPS没法定位这一顽固问题