系列文章总结一些比较常见的设计模式,外观模式是由GoF提出的23种设计模式的一种,使用非常简单。
-09-16
增加一个例子区别于代理模式,都像是插入第三者,但是外观模式是统筹管理子系统,就好像进行一个一键设置。代理模式是接口一样,有一个基类。
文章目录
外观模式(门面模式)概念结构和三个角色举个例子需求及代码实现总结外观模式(门面模式)概念
根据迪米特法则,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。
Facade模式也叫外观模式。Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供-个一致的简单的界面。这个一致的简单的界面被称作 facade.
定义中提到的子系统是指在设计中为了降低复杂性根据一定的规则(比如业务、功能),对系统进行的划分。子系统中封装有- -些类。客户程序在使用子系统的时候,可能会像下图.一样零乱。
在上面的实现方法中,客户类紧紧地依赖在子系统的实现上。子系统发生的变化,很可能要影响到客户类的调用。而且子系统在不断优化、可重用化的重构路上,会产生更多更小的类。这对使用子系统的客户类来说要完成-一个工作流程,似乎要记住的接口太多了。
门面模式就是为了解决这种问题而产生的。看看使用了门面模式后的图:
这样就减少了客户程序和子系统之间的耦合,增加了可维护性
结构和三个角色
门面角色(facade): 这是门面模式的核心。它被客户角色调用,因此它熟悉子系统的功能。它内部根据客户角色已有的需求预定了几种功能组合。.子系统角色:实现了子系统的功能。对它而言,facade角色就和客户角色一样是未知的,.它没有任何facade角色的信息和链接。客户角色:调用facade角 色来完成要得到的功能。举个例子
比如医院作为一个子系统,按照部门职能,这个系统可以划分为挂号、门诊、划价、化验、收费、取药等。看病的病人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的各个类打交道一样,不是一件容易的事情。首先病人必须先挂号,然后门诊。如果医生要求化验,病人必须首先划价,然后缴款,才能到化验部门做化验。化验后,再回到门诊室。解决这种不便的方法便是引进门面模式。可以设置一个接待员的位置,由接待员负责代为挂号、划价、缴费、取药等。这个接待员就是门面模式的体现,病人只接触接待员,由接待员负责与医院的各个部门打交道。第二个例子就是下面的代码
需求及代码实现
游戏模式和ktv模式实现一致,代码中不再重复体现
# include<iostream>using namespace std;//电视机class Television{public:void On(){cout<<"电视机打开..."<<endl;}void Off(){cout << "电视机关闭..." << endl;}};//灯class Light{public:void On(){cout << "灯打开..." << endl;}void Off(){cout << "灯关闭..." << endl;}};//音箱class Audio{public:void On(){cout << "音箱打开..." << endl;}void Off(){cout << "音箱关闭..." << endl;}};//DVD播放器class DvDPlayer{public:void On(){cout << "DVD打开..." << endl;}void Off(){cout << "DVD关闭..." << endl;}};//麦克风class Mircophone{public:void On(){cout << "麦克风打开..." << endl;}void Off(){cout << "麦克风关闭..." << endl;}};//ktv模式class KTVMode{public:public:KTVMode(){pTelevision = new Television;pLight = new Light;pAudio = new Audio;pMircophone = new Mircophone;pDvDPlayer=new DvDPlayer;}~KTVMode(){delete pTelevision;delete pLight;delete pAudio;delete pMircophone;delete pDvDPlayer;}//ktv模式 启动 统一管理各个系统void runktv(){pTelevision->On();pLight->Off();pAudio->On();pMircophone->On();pDvDPlayer->On();}//ktv模式 关闭 统一管理各个系统void offktv(){pTelevision->Off();pLight->On();pAudio->Off();pMircophone->Off();pDvDPlayer->Off();}private:Television* pTelevision;Light* pLight;Audio* pAudio;Mircophone* pMircophone;DvDPlayer* pDvDPlayer;};int main(){KTVMode* p = new KTVMode;p->runktv();p->offktv();return 0;}
总结
整体感觉就是,使用简单,但是又很关键和方便。 如有错误,欢迎指出。