设为首页 加入收藏

TOP

C++设计模式之外观模式(二)
2015-07-20 17:47:10 来源: 作者: 【 】 浏览:1
Tags:设计模式 外观 模式

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

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

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

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

#ifndef _RESOURSE_H_
#define _RESOURSE_H_

#include 
  
   
#include 
   
     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 
  
   
#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.使用外观模式的实现方式<??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ICAgILG4t93Eo7/ptPrC68O709Cx5Luvo6zKtc/WtPrC68jnz8I6PC9wPgo8cHJlIGNsYXNzPQ=="brush:java;">#ifndef _RESOURSE_H_ #define _RESOURSE_H_ #include #include 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 
  
   
#include "Facade.h"
using namespace std;


int main()
{
	//创建外观对象
	BakeupFacade * pBakeupFacade = new BakeupFacade();

	//备份
	pBakeupFacade->BakeupResourse();

	//销毁对象
	delete pBakeupFacade;
	pBakeupFacade = NULL;

	return 0;
}
  

编译并执行,结果如下:

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



】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Lua 中栈操作的C API示例 下一篇C++设计模式之外观模式(三)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·哈希表 - 菜鸟教程 (2025-12-24 20:18:55)
·MySQL存储引擎InnoDB (2025-12-24 20:18:53)
·索引堆及其优化 - 菜 (2025-12-24 20:18:50)
·Shell 中各种括号的 (2025-12-24 19:50:39)
·Shell 变量 - 菜鸟教 (2025-12-24 19:50:37)