C++外观模式

来源:互联网 发布:舆情指数算法 编辑:程序博客网 时间:2024/05/22 12:56

在讲解模式之前,先来举个生活中的例子吧:为了方便,一个电源总开关控制四盏灯,一个风扇,一台空调和一台电视机的启动与关闭。假设没有这个总开关,可想而知,启动一次或者关闭一次这些设备,需要重复多次相同的工作。适当引入电源总开关同时控制所有设备,极大的提高了效率,这就是外观模式的缩影。这篇博客具体讲解了外观模式,对模式动机,使用场景,优缺点,UML类图等进行了分析,以及C++代码实现。外观模式(Facade)是指外部与子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式,完美的体现了迪米特法则,引入外观模式后,用户只需直接与外观角色交互,用户与子系统之间的复杂关系由外观角色来实现,从而降低了系统的耦合度。提高了客户端使用的便捷性,使得客户端无须关系子系统的工作细节,通过外观即可调用相关功能。下面我们以一个系统需求入手来进行分析:

某软件公司为新开发的智能手机控制与管理软件提供了一键备份功能,通过该功能可以将原本存储在手机中的通信录、短信、照片、歌曲等资料一次性全部拷贝到移动存储介质(例如MMC卡或SD卡)中。在实现过程中需要与多个已有的类进行交互,例如通讯录管理类、短信管理类等,为了降低系统的耦合度,试使用合适的设计模式来设计并编程模拟实现该一键备份功能。

       在这个需求题目中,同时将资料拷贝到不同的存储设备中,这里我们就定义三种备份资料(短信,照片,歌曲)来进行设计,下面是UML类图:

UML类图

其中,外观类与三个具体的备份类是组合关系,具有一定UML基础的朋友们一眼就可看懂原理,融入到自己程序设计中。

下面是C++代码的实现:

CopyMessage.h:#pragma #include<iostream>using namespace std;class CopyMessage{public:CopyMessage();~CopyMessage();void copy();};CopyMessage.cpp:#include "CopyMessage.h"CopyMessage::CopyMessage(){}CopyMessage::~CopyMessage(){}void CopyMessage::copy() {cout << "短信已备份;" << endl;}CopyMusic.h:#pragma once#include<iostream>using namespace std;class CopyMusic{public:CopyMusic();~CopyMusic();void copy();};CopyMusic.cpp:#include "CopyMusic.h"CopyMusic::CopyMusic(){}CopyMusic::~CopyMusic(){}void CopyMusic::copy() {cout << "音乐已备份;" << endl;}CopyPicture.h:#pragma once#include<iostream>using namespace std;class CopyPicture{public:CopyPicture();~CopyPicture();void copy();};CopyPicture.cpp:#include "CopyPicture.h"CopyPicture::CopyPicture(){}CopyPicture::~CopyPicture(){}void CopyPicture::copy() {cout << "照片已备份;" << endl;}Facade.h:#pragma once#include "CopyMessage.h"#include "CopyMusic.h"#include "CopyPicture.h"class Facade{private:CopyMessage msg;CopyMusic music;CopyPicture picture;public:Facade();~Facade();void copy();};Facade.cpp:#include "Facade.h"Facade::Facade(){}Facade::~Facade(){}void Facade::copy() {msg.copy();picture.copy();music.copy();}main.cpp:#include<iostream>#include "Facade.h"using namespace std;int main() {Facade facade;facade.copy();system("pause");}

最后我们来说一下外观模式的优缺点吧。它的优点有很明显,对客户屏蔽了子系统组件,客户代码变得简单,与之关联的对象减少;子系统和客户端之间松耦合,子系统的变化不会影响到客户端使用它;降低了大型系统的编译依赖性等等。然而缺点也是不可避免的,它不能很好的限制客户使用子系统,如果对子系统限制太多则减少了可变性和灵活性;在不引入抽象类的情况下,增加子系统会违背开闭原则等等。

外观模式确实属于比较简单的模式了。但是在系统开发中是使用频率非常高的模式,很有必要掌握它,在我们的程序设计中合理运用它,将会给程序设计带来很多的好处。希望这篇博客对大家学习外观模式有所帮助,若有疑问的,可向我留言,有问必答!

1 0