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; }
编译并执行,结果如下:
原文地址:http://blog.csdn.net/apelife/article/details/38962645