说明:本文仅供学习交流,转载请标明出处。欢迎转载。

在我们学习程序设计时经常会用到模块化设计的思想,这一思想是我们首先把要实现的功能用一个模块表示,当用户想完毕某个人物时依次调用相应的函数。

然而。假设用户要完毕一个非常大的任务。则须要调用非常大模块函数。这样用户与各个模块打交道就非常频繁了,同一时候也非常easy出错,由于用户与某个详细模块打交道,耦合度相对照较高。而外观模式(Facade)就在此时能够派上用场了。

外观模式的定义:为子系统中的一组接口(相当与上面的模块)提供一个一致的界面。此模式定义了一个高层接口,这个结口使得这一子系统更加easy使用。

说白了就是:我们仅仅需调用高层的函数接口。而不用关心高层内部调用是怎样组合底层方法的。更不用关心底层函数是怎样实现的。

外观模式例如以下图所看到的:

 本图来自《大话设计模式》网上电子稿   

举例:

我们如今须要完毕两个工作:要完毕这两个工作。要完毕工作1我们须要依次完毕子工作Sub_Work1、Sub_Work3。要完毕工作2我们须要依次完毕工作Sub_Work2,Sub_Work3。Sub_Work4。为了能让用户与这些子工作分离。我们採用外观模式在中间插入一个工作处理中心Work,这个Work负责处理用户的需求已经集成对应的底层子系统,代码实现例如以下:

#include<iostream>
using namespace std; class Sub_Work1//子工作1
{
public:
void Working1()
{
cout<<"Doing Sub-Work1..."<<endl;
}
}; class Sub_Work2//子工作2
{
public:
void Working2()
{
cout<<"Doing Sub-Work2..."<<endl;
}
}; class Sub_Work3//子工作3
{
public:
void Working3()
{
cout<<"Doing Sub-Work3..."<<endl;
}
}; class Sub_Work4//子工作4
{
public:
void Working4()
{
cout<<"Doing Sub-Work4..."<<endl;
}
};
class Work//总工作,客户与之打交道
{
private:
Sub_Work1 w1;
Sub_Work2 w2;
Sub_Work3 w3;
Sub_Work4 w4;
public:
void Work1()//总工作1
{
w1.Working1();
w3.Working3();
}
void Work2()//总工作2
{
w2.Working2();
w3.Working3();
w4.Working4();
}
}; int main()//client程序
{
Work w;
/*******总工作1******/
cout<<"開始调用总工作1"<<endl;
w.Work1(); /*******总工作2******/
cout<<endl<<"開始调用总工作2"<<endl;
w.Work2();
return 0;
}

測试结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSlhIXzEyMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">



參考资料:

[1]《大话设计模式》

[2]《设计模式之禅》

[3]《HeadFirst设计模式》

最新文章

  1. socket.io安装部署
  2. android——数据库版本升/降级问题
  3. Nova 组件详解 - 每天5分钟玩转 OpenStack(26)
  4. NSMutableDictionary中 setValue和setObject的区别
  5. python-汉诺塔递归实现
  6. CSS从大图片上截取小图标的操作
  7. js中this的理解
  8. maven 错误No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in the format
  9. Careercup - Microsoft面试题 - 5673934611546112
  10. 免安装jdk 和 免安装tomcat
  11. js正则表达式之解析——URL的正则表达式
  12. Java使用线程池递归压缩文件夹下面的所有子文件
  13. Linux 下安装oracle数据库
  14. C# @字符用法
  15. Windows Search Service
  16. Nginx集群之WCF分布式局域网应用
  17. jQuery框架-1.基础知识
  18. spring 自定义事件发布及监听(简单实例)
  19. 【由浅入深理解java集合】(三)——集合 List
  20. Linux解压缩命令tar

热门文章

  1. JAVA学习篇--javaweb之Filter具体解释
  2. 解决从github下载web的源代码部署到eclipse的问题
  3. USB 管道 &amp;&amp; 端点
  4. centos7启动时出现“无法应用原保存的显示器配置”
  5. Combo( 自定义下拉框) 组件
  6. ASP.NET MVC全局观
  7. iOS分享 - 对象间的通信之delegate、notificationCenter与block
  8. Swift 变量、常量、数据类型
  9. 拦截Response.Redirect的跳转并转换为Js的跳转
  10. DataTable 对象 转换为Json 字符串