4.5Fasade 外观模式

来源:互联网 发布:黑暗启示录2bt版java 编辑:程序博客网 时间:2024/06/06 10:56

意图:

外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化。那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦?这就是外观模式的作用了,我们通过一个外观类定义一个高层接口,该接口中包含子系统的中的接口,这样客户端只需要通过外观类访问各种子系统就可以啦。

 

UML结构图:


例子:

大话设计模式上股票买卖的例子:将股票买卖工作从客户端转移到Fund类中,给Fund类托管。将复杂系统的内部子系统与客户程序之间的依赖解耦。

#include <iostream>using namespace std;class Stock1{public:void Sell(){cout<<"股票卖出"<<endl;}void Buy(){cout<<"股票买入"<<endl;}};class Stock2{public:void Sell(){cout<<"股票卖出"<<endl;}void Buy(){cout<<"股票买入"<<endl;}};class NationalDebt{public:void Sell(){cout<<"国债卖出"<<endl;}void Buy(){cout<<"国债买入"<<endl;}};class Realty{public:void Sell(){cout<<"房地产卖出"<<endl;}void Buy(){cout<<"房地产买入"<<endl;}};class Fund{private:Stock1 *stock1;Stock2 *stock2;NationalDebt *nationaldebt;Realty *realty;public:Fund(){stock1 = new Stock1();stock2 = new Stock2();nationaldebt = new NationalDebt();realty = new Realty();}~Fund(){delete stock1;delete stock2;delete nationaldebt;delete realty;}void BuyFund(){stock1->Buy();stock2->Buy();nationaldebt->Buy();realty->Buy();}void SellFund(){stock1->Sell();stock2->Sell();nationaldebt->Sell();realty->Sell();}};int main(int argc, char **argv){Fund *f = new Fund();f->BuyFund();f->SellFund();delete f;system("pause");return 0;}

通过外观模式客户端只需要访问Fund类中的成员就可以了,并不需要与具体的每个Stock1Stock2NationalDebt相关联。这大大降低了耦合性,同时也使得系统容易维护,易于扩展。若需要扩展股票类,只需要加入Stock类;若有了新的购买方案,只需要在Fund类中加一个BuyMethod方法。

 

使用:

1)在设计初期阶段,应该有意识的将不同的两个层分离,比如经典的三层架构,就需要考虑在数据访问层、业务逻辑层和表示层的层与层之间建立外观,这样可以为复杂的子系统提供一个简单的接口,使得耦合性大大的降低。

2)在开发阶段,子系统往往因为不断的重构演化而变得原来越复杂,大多数的模式使用时也都会产生很多很小的类,这本是好事,但也给外部调用它们的用户程序带来了使用上的困难,增加外观可以提供一个简单的接口,减少它们之间的依赖。

3)在维护一个遗留的一个大型系统时,可能这个系统已经非常难以维护和扩展了,但是因为它包含非常重要的功能,新的系统开发必须依赖它,这时也可以应用外观模式。可以为新系统开发一个外观类,来提供粗糙和高度复杂的遗留代码的比较清晰、简单的接口,让新系统与外观类对象交互,外观类负责与遗留代码交互所有复杂的工作。这样分两个小组,一个小组开发外观类与老系统的交互,另一个小组只要了解外观类的接口,直接开发新系统调用这些接口就可以了。


原创粉丝点击