目录
意图(Intention)
为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
结构(Structure)
其中,
Facade:外观类为子系统提供一个共同的对外接口
ubsystem classes:实现子系统的功能;处理有Facade对象指派的任务;没有Facade的任何相关信息
Client:客户对象通过一个外观接口读写子系统中各接口的数据资源
优点
(1)实现了子系统与客户端之间的松耦合关系。
(2)客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。
适用于
1.要为一个复杂的子系统提供一个简单的接口时,子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类,这使得子系统更具有可重用性,也更容易对于子系统进行定制,但也给那些不需要定制子系统的用户带来一些使用上的困难,Facade可以提供一个简单的默认视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制的用户可以越过Facade层。
2.客户程序与抽象类的实现部分存在着很大的依赖性。引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
3.当需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,则可以让他们仅通过Facade进行通信,从而简化了它们之间的依赖关系。
几种模式的区分
Facade模式注重简化接口
Adapter模式注重转换接口
Bridge模式注重分离接口(抽象)与其实现
Decorator模式注重稳定接口的前提下为对象扩展功能
Example
背景:投资者自己进行投资,不论是购买股票还是债券等,都面临着多种多样的选择。可以用下面这幅图来表示,表示表示许多投资者,面临着多种投资选择(简单来说,就是股民要从数千只股票中选择投资哪个)
这时候,随着居民投资理财一时的提高,一个基金机构出现了,为大多数不懂投资,不懂股票的投资人带来了福音。简单来说,这个机构就是代替大家买股票投资,股民出钱,基金来运作投资。股民不需要关心我要去选择投资哪只股票,投资哪种债券,只要交给基金一切就OK了。下面这幅图用来表达基金出现之后。
其实,这就是Facade外观模式,将所有投资选择都组合成一个Facade类,股民只需要知道Facade类就可以了,里面的各种股票,债券类是不需要了解的,也就是说,外观类为子系统提供一个共同的对外接口。
下面是代码实现
对应结构图中Subsystems:各种投资选择(股票,债券,房地产......)
class Stock1
{
public void Buy()
{
Console.WriteLine("Buy Stock1");
}
public void Sell()
{
Console.WriteLine("Sell Stock1");
}
}
class Stock2
{
//代码同上
}
class NationalDebt
{
//代码同上
}
class Property
{
//代码同上
}
对应结构图中的Facade类:基金类(组合了股票,国债和房地产)
class FacadeFund
{
Stock1 sk1;
Stock2 sk2;
Stock3 sk3;
NationalDebt nd;
Property p;
public FacadeFund()
{
sk1 = new Stock1();
sk2 = new Stock2();
sk3 = new Stock3();
nd = new NationalDebt();
p = new Property();
}
//基金类,他需要了解所有的股票或者其它投资方式的方法或属性,进行组合,以备外界调用
public void BuyFund()
{
sk1.Buy();
sk2.Buy();
sk3.Buy();
nd.Buy();
p.Buy();
}
public void SellFund()
{
sk1.Sell();
sk2.Sell();
sk3.Sell();
nd.Sell();
p.Sell();
}
}
客户端代码:
FacadeFund fund = new FacadeFund();
//购买基金
fund.BuyFund();
//基金赎回
fund.SellFund();
Console.Read();