外观模式的结构和说明
①Façade:定义子系统的多个模块对外的高层接口,通常需要调用内部多个模块,从而把客户的请求代理给适当的子系统对象
②模块:接受Façade对象的委派,真正实现功能,各个模块之间可能有交互。但请注意,Façade对象知道各个模块,但是各个模块不应该知道Façade对象。
思考外观模式
①外观模式的本质:封装交互、简化调用。Façade封装了子系统外部和子系统内部多个模块的交互过程,从而简化了外部的调用,通过外观,子系统为外部提供一些高层的接口,以方便它们的使用。它很好的体现了“最少知识原则(DoL)”
②外观模式的目的:外观模式的目的不是给子系统添加新的功能接口,而是为了让外部减少与子系统内部多个模块的交互,松散耦合,从而让外部能够更简单地使用子系统。
③Façade表面上看只是把客户端的代搬到了Façade里,但是有本质上的区别。因为Façade位于系统而不是客户端的一侧,它相当于屏蔽了外部客户端和系统内部模块的交互,同时Façade可以被多个客户端调用,实现复用。
④外观是当作子系统对外的接口出现的,虽然可以在这里定义一些子系统没有的功能,但不建议这样做。外观应该是包装己有的功能,而不是添加新的功能。因为有时客户端可能需要绕开Façade,直接调用某个具体模块。而如果在Façade中添加新的功能,但可能最后调用的结果是不同的。
⑤外观可以提供一些缺省的功能实现。
【编程实验】注册公司(通过外观模式提供简化的办理流程)
//声明文件
//结构型模式:外观模式
//场景:注册公司。
#include <iostream>
using namespace std;
//质检局:Quality Supervision Burean
class CQualitySupervisionBurean{
public:
void OrgCodeCertificate();
};
//工商局:Industrial and Commercial Bureau
class CIndustrialAndCommercialBureau{
public:
void CheckConflictName();
};
//税务局: Tax Bureau;
class CTaxBureau{
public:
void TaxCertificate();
};
//银行:Bank;
class CChinaBank{
public:
void OpenAccount();
};
//提供一个外观类(注册公司)
class CRegisterFacade{
private:
CQualitySupervisionBurean* pQualitySupervisionBurean;
CIndustrialAndCommercialBureau* pIndustrialAndCommercialBureau;
CTaxBureau* pTaxBureau;
CChinaBank* pChinaBank;
public:
CRegisterFacade();
void RegistCompany();
~CRegisterFacade();
};
//实现文件
//质检局:Quality Supervision Burean
void CQualitySupervisionBurean::OrgCodeCertificate(){ cout << "到质检局办理组织机构代码证" << endl;}
//工商局:Industrial and Commercial Bureau
void CIndustrialAndCommercialBureau::CheckConflictName(){ cout << "到工商局检查名字是否冲突" << endl; }
//税务局: Tax Bureau;:
void CTaxBureau::TaxCertificate(){ cout << "到税务局办理税务登记证" << endl; }
//银行:Bank;
void CChinaBank::OpenAccount(){ cout << "到银行开户" << endl; }
//提供一个外观类(注册公司)
CRegisterFacade::CRegisterFacade(){
pQualitySupervisionBurean = new CQualitySupervisionBurean();
pIndustrialAndCommercialBureau = new CIndustrialAndCommercialBureau();
pTaxBureau = new CTaxBureau();
pChinaBank = new CChinaBank();
}
void CRegisterFacade::RegistCompany(){
pQualitySupervisionBurean->OrgCodeCertificate();
pIndustrialAndCommercialBureau->CheckConflictName();
pTaxBureau->TaxCertificate();
pChinaBank->OpenAccount();
}
CRegisterFacade::~CRegisterFacade(){
delete pQualitySupervisionBurean;
delete pIndustrialAndCommercialBureau;
delete pTaxBureau;
delete pChinaBank;
}
//测试客户端
void main()
{
CRegisterFacade oRegisterFacade; oRegisterFacade.RegistCompany();
}