首页 > 代码库 > 设计模式之五-Facade模式
设计模式之五-Facade模式
Facade门面模式,也是比较常用的一种模式,其含义是为子系统中的一组接口提供一个一致的界面, Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。简单说,就是将复杂的逻辑封装起来,对外公开简单的接口,由客户程序调用。
以收发信件和警察检查实例为例
说明:邮局对外只有一个窗口,接收信件内容和邮件地址。对内调用邮件处理的4个函数。将复杂逻辑封装在邮局的里面,当需要增加警察来检查信件时,只需在邮局内增加警察检查信件的方法。
注意:将复杂逻辑封装起来,对外只有一个简单的接口。
抽象信件处理类
//ILetterProcess.h #pragma once #include <iostream> using std::string; class ILetterProcess { public: ILetterProcess(void); virtual ~ILetterProcess(void); virtual void WriteContext(string context) = 0; virtual void FillEnvelope(string address) = 0; virtual void LetterIntoEnvelope() = 0; virtual void SendLetter() = 0; };
//ILetterProcess.cpp #include "StdAfx.h" #include "ILetterProcess.h" ILetterProcess::ILetterProcess(void) { } ILetterProcess::~ILetterProcess(void) { }
信件处理实现类
//LetterprocessImpl.h #pragma once #include "iletterprocess.h" class CLetterProcessImpl : public ILetterProcess { public: CLetterProcessImpl(void); ~CLetterProcessImpl(void); void WriteContext(string context); void FillEnvelope(string address); void LetterIntoEnvelope(); void SendLetter(); };
//LetterProcessImpl.cpp #include "StdAfx.h" #include "LetterProcessImpl.h" #include <iostream> using std::string; using std::cout; using std::endl; CLetterProcessImpl::CLetterProcessImpl(void) { } CLetterProcessImpl::~CLetterProcessImpl(void) { } void CLetterProcessImpl::WriteContext(string context) { cout << "填写信的内容... ..." << endl; } void CLetterProcessImpl::FillEnvelope(string address) { cout << "填写收件人地址及姓名... ..." << endl; } void CLetterProcessImpl::LetterIntoEnvelope() { cout << "把信放到信封中..." << endl; } void CLetterProcessImpl::SendLetter() { cout << "邮递信件..." << endl; }
邮局处理信件类
//ModenPostOffice.h #pragma once #include "ILetterProcess.h" #include "LetterProcessImpl.h" #include "LetterPolice.h" #include <iostream> using std::string; class CModenPostOffice { public: CModenPostOffice(void); ~CModenPostOffice(void); void SendLetter(string context, string address); private: ILetterProcess *m_pLetterProcess; CLetterPolice *m_pLetterPolice; };
//ModenPostOffice.cpp #include "StdAfx.h" #include "ModenPostOffice.h" CModenPostOffice::CModenPostOffice(void) { this->m_pLetterProcess = new CLetterProcessImpl(); this->m_pLetterPolice = new CLetterPolice(); } CModenPostOffice::~CModenPostOffice(void) { delete m_pLetterProcess; delete m_pLetterPolice; } void CModenPostOffice::SendLetter( string context, string address ) { //帮忙写信 m_pLetterProcess->WriteContext(context); //写好信封 m_pLetterProcess->FillEnvelope(address); //警察要检查信件了 m_pLetterPolice->CheckLetter(m_pLetterProcess); //把信放到信封中 m_pLetterProcess->LetterIntoEnvelope(); //邮递信件 m_pLetterProcess->SendLetter(); }
测试
//Facade.cpp #include "stdafx.h" #include "ILetterProcess.h" #include "LetterProcessImpl.h" #include "ModenPostOffice.h" #include<iostream> using std::string; using std::cout; using std::endl; void DoItByPostOffice() { CModenPostOffice modenPostOffice; string context = "Hello, It‘s me, do you know who I am? I‘m your old lover. I‘d like to ... ..."; string address = "Happy Road No. 666, Beijing City, China"; modenPostOffice.SendLetter(context, address); } void DoItYourself() { ILetterProcess *pLetterProcess = new CLetterProcessImpl(); pLetterProcess->WriteContext("Hello, It‘s me, do you know who I am? I‘m your old lover. I‘d like to ... ..."); pLetterProcess->FillEnvelope("Happy Road No. 666, Beijing City, China"); pLetterProcess->LetterIntoEnvelope(); pLetterProcess->SendLetter(); delete pLetterProcess; } int _tmain(int argc, _TCHAR* argv[]) { //现在的调用方式。对于客户来说确实简单多了。 //如需要增加逻辑,例如让警察来检查邮件。可以在邮局里完成这项工作。 DoItByPostOffice(); //原来的调用方式。 DoItYourself(); system(“pause”); return 0; }
转载自http://blog.csdn.net/phiall/article/details/52199659
设计模式之五-Facade模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。