本文共 1963 字,大约阅读时间需要 6 分钟。
原文地址:
Facade模式: Facade模式为子系统的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
Facade模式在什么时候使用最好呢? 这要分三个阶段来说,首先,在设计初期阶段,应该要有意识的将不同的层分离,比如经典的三层架构,就需要考虑在数据访问层和业务逻辑层、业务逻辑层和表示层的层与层之间建立Facade,这样可以为复杂的子系统提供一个简单的接口,使得耦合大大降低。其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,大多数的模式使用时也都会产生很多很小的类,这本来是好事,但也给外部调用它们的用户程序带来了使用上的困难,增加Facade可以提供一个简单的接口,减少它们之间的依赖。第三,在维护一个一流的大型系统时,可能这个系统已经非常难以维护和扩展了,但因为它包含非常重要的功能,新的需求开发必须要依赖于它。此时用Facade也是非常适合的。可以为新系统开发一个Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。
Facade模式典型的结构图为:
以投资股票为例,股民需要了解想购买的所有股票,那么众多的投资者和众多的个股联系太多,即要了解相关个股,又不够专业,而如果投资基金的话,具体是买股票还是债券还是外汇等就不需要关心了,基金经理给你打理好了一切,只需关注基金的盈亏就行了。而这个基金就是Façade。因此,股民买个股可以设计为:一个“股票”基类,然后是继承“股票”的“个股A”,“个股B”,“个股n”,股民需要操作每只股票的接口“买”和“卖”。而股民买个股的设计就变为了:股民直接操作“基金”类的接口,由“基金”去操作个股的“买”,“卖”,债券的“买”,“卖”,…。
下面是Façade的实现代码://Facade.h#ifndef _FACADE_H_#define _FACADE_H_// 股票1class Stock1{public: Stock1(); ~Stock1(); void Operation();protected:private:};// 股票2class Stock2{public: Stock2(); ~Stock2(); void Operation();protected:private:};// 国债class NationalDebt{public: NationalDebt(); ~NationalDebt(); void Operation();protected:private:};// 基金class Fund{public: Fund(); ~Fund(); void OperationWrapper();protected:private: Stock1* _stock1; Stock2* _stock2; NationalDebt* _subs2;};#endif //~_FACADE_H_//Facade.cpp#include "Facade.h"#includeusing namespace std;Stock1::Stock1(){}Stock1::~Stock1(){}void Stock1::Operation(){ cout<<"Stock1::Operation..买股票1"< _stock1 = new Stock1(); this->_stock2 = new Stock2(); this->_subs2 = new NationalDebt();}Fund::~Fund(){ delete _stock1; delete _stock2; delete _subs2;}void Fund::OperationWrapper(){ this->_stock1->Operation(); this->_stock2->Operation(); this->_subs2->Operation();}//main.cpp#include "Facade.h"#include using namespace std;int main(int argc,char* argv[]){ // 基金 Fund* f = new Fund(); // 操作基金 f->OperationWrapper(); return 0;}