设计模式之五-Facade模式
Posted 万载一梦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之五-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模式的主要内容,如果未能解决你的问题,请参考以下文章