4.5Fasade 外观模式
意图:外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化。那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦?这就是外观模式的作用了,我们通过一个外观类定义一个高层接
意图:
外观模式(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类中的成员就可以了,并不需要与具体的每个Stock1,Stock2和NationalDebt相关联。这大大降低了耦合性,同时也使得系统容易维护,易于扩展。若需要扩展股票类,只需要加入Stock类;若有了新的购买方案,只需要在Fund类中加一个BuyMethod方法。
使用:
(1)在设计初期阶段,应该有意识的将不同的两个层分离,比如经典的三层架构,就需要考虑在数据访问层、业务逻辑层和表示层的层与层之间建立外观,这样可以为复杂的子系统提供一个简单的接口,使得耦合性大大的降低。
(2)在开发阶段,子系统往往因为不断的重构演化而变得原来越复杂,大多数的模式使用时也都会产生很多很小的类,这本是好事,但也给外部调用它们的用户程序带来了使用上的困难,增加外观可以提供一个简单的接口,减少它们之间的依赖。
(3)在维护一个遗留的一个大型系统时,可能这个系统已经非常难以维护和扩展了,但是因为它包含非常重要的功能,新的系统开发必须依赖它,这时也可以应用外观模式。可以为新系统开发一个外观类,来提供粗糙和高度复杂的遗留代码的比较清晰、简单的接口,让新系统与外观类对象交互,外观类负责与遗留代码交互所有复杂的工作。这样分两个小组,一个小组开发外观类与老系统的交互,另一个小组只要了解外观类的接口,直接开发新系统调用这些接口就可以了。
更多推荐
所有评论(0)