说明:本文仅供学习交流,转载请标明出处,欢迎转载!
在我们学习程序设计时常常会用到模块化设计的思想,这一思想是我们首先把要实现的功能用一个模块表示,当用户想完成某个人物时依次调用对应的函数。然而,如果用户要完成一个很大的任务,则需要调用很大模块函数,这样用户与各个模块打交道就非常频繁了,同时也很容易出错,因为用户与某个具体模块打交道,耦合度相对比较高。而外观模式(Facade)就在此时可以派上用场了。
外观模式的定义:为子系统中的一组接口(相当与上面的模块)提供一个一致的界面,此模式定义了一个高层接口,这个结口使得这一子系统更加容易使用。
说白了就是:我们只需调用高层的函数接口,而不用关心高层内部调用是如何组合底层方法的,更不用关心底层函数是如何实现的。
外观模式如下图所示:
本图来自《大话设计模式》网上电子稿
举例:
我们现在需要完成两个工作:要完成这两个工作。要完成工作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()//客户端程序 { Work w; /*******总工作1******/ cout<<"开始调用总工作1"<<endl; w.Work1(); /*******总工作2******/ cout<<endl<<"开始调用总工作2"<<endl; w.Work2(); return 0; }
测试结果:
参考资料:
[1]《大话设计模式》
[2]《设计模式之禅》
[3]《HeadFirst设计模式》