C++设计模式之外观模式(二)

来源:互联网 发布:qq密码账号数据库泄露 编辑:程序博客网 时间:2024/06/05 08:06

2、手机备份软件的设计与实现

某软件公司将开发一款手机备份软件,功能如下:能够对手机中的通讯录,短信,照片这些资源进行备份。通讯录,短信,照片备份是三个独立的模块。请用外观模式对此进行设计。

1.不使用外观模式的实现方式

    TelphoneNumber为通讯录备份模块、ShortMessage为短信备份模块、Image为照片备份模块。实现代码如下:

#ifndef _RESOURSE_H_#define _RESOURSE_H_#include <iostream>#include <string>using namespace std;//电话号码类class TelphoneNumber{public:void BakeUpTelphoneNumber(){cout << "备份电话号码" << endl;}};//短信类class ShortMessage{public:void BakeUpShortMessage(){cout << "备份短信" << endl;}};//照片类class Image{public:void BakeUpImage(){cout << "备份照片" << endl;}};#endif
    测试代码实现如下:
#include <iostream>#include "Resourse.h"using namespace std;int main(){/*******************备份电话号码**************************/TelphoneNumber * pTelphoneNumber  = new TelphoneNumber();pTelphoneNumber->BakeUpTelphoneNumber();/*******************备份短信**************************/ShortMessage * pShortMessage = new ShortMessage();pShortMessage->BakeUpShortMessage();/*******************备份照片**************************/Image * pImage = new Image();pImage->BakeUpImage();/*******************销毁操作**************************/delete pTelphoneNumber;pTelphoneNumber = NULL;delete pShortMessage;pShortMessage = NULL;delete pImage;pImage = NULL;return 0;}
    编译并运行结果如下:


    虽然上述代码能实现对电话号码,短信,照片进行备份。但客户端直接操作电话备份、短信备份、照片备份模块,客户端需要知道备份的具体细节,客户端与这三个类耦合性升高了,违背迪迷特法则,最小朋友原则。现在只在客户端进行备份操作,如果其他地方也需要备份操作,复用性不强;如果备份操作进行了修改,则多个地方将进行修改,维护性差。因此需要对上述代码进行重构,封装一个外观类,由外观类对三种资源进行备份操作,使得客户类与备份模块解耦。

2.使用外观模式的实现方式

    备份模块代码没有变化,实现代码如下:

#ifndef _RESOURSE_H_#define _RESOURSE_H_#include <iostream>#include <string>using namespace std;//电话号码类class TelphoneNumber{public:void BakeUpTelphoneNumber(){cout << "备份电话号码" << endl;}};//短信类class ShortMessage{public:void BakeUpShortMessage(){cout << "备份短信" << endl;}};//照片类class Image{public:void BakeUpImage(){cout << "备份照片" << endl;}};#endif
    添加一个备份外观类BakeupFacade,由它对备份模块进行操作,解除客户类与具体备份模块的耦合。它将所有从客户端发来的请求委派到相应的子系统去,传递给相应的子系统对象处理。
#ifndef _FACADE_H_#define _FACADE_H_#include "Resourse.h"//备份外观class BakeupFacade{private://维护对电话号码、短信、照片对象的引用TelphoneNumber * m_pTelphoneNumber;ShortMessage * m_pShortMessage;Image * m_pImage;public://外观构造函数,创建手机,短信,照片对象BakeupFacade(){m_pTelphoneNumber = new TelphoneNumber();m_pShortMessage = new ShortMessage();m_pImage = new Image();}//备份资源void BakeupResourse(){m_pTelphoneNumber->BakeUpTelphoneNumber();m_pShortMessage->BakeUpShortMessage();m_pImage->BakeUpImage();}};#endif
    测试代码实现如下:
#include <iostream>#include "Facade.h"using namespace std;int main(){//创建外观对象BakeupFacade * pBakeupFacade = new BakeupFacade();//备份pBakeupFacade->BakeupResourse();//销毁对象delete pBakeupFacade;pBakeupFacade = NULL;return 0;}

    编译并执行,结果如下:


    引入了外观类,外观类对备份模块进行操作,解除了客户类与备份模块的耦合性。客户类不需要直接操作子系统,而是由外观类负责处理,对客户端而言是透明的,客户类只需要操作外观类就可以了,符合"迪迷特法则"。如果多个地方需要Facade,也就是说外观可以实现功能的共享,也就是实现复用。同样的调用代码只用在Facade里面写一次就好了,不用在多个调用的地方重复写。如果某个备份模块需要修改,只需要修改这个备份模块就可以了,对客户端无影响,维护性好。



1 0
原创粉丝点击