2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > [设计模式C++]外观模式

[设计模式C++]外观模式

时间:2020-09-10 15:50:11

相关推荐

[设计模式C++]外观模式

系列文章总结一些比较常见的设计模式,外观模式是由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;}

总结

整体感觉就是,使用简单,但是又很关键和方便。 如有错误,欢迎指出。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。