什么是外观模式?
引入了一个接口,通过这个接口,使得客户端和子系统的交互更加方便简单。
理解:
我们大家都有过自己做饭和直接去饭店吃饭的经历,自己做饭的话,不仅要准备做菜的原料,还要准备做菜的厨具,还要自己去菜市场把菜买回家,如图一所示,而我们直接去饭店吃饭呢,直接点自己爱吃的菜就可以,正因为有了厨师,我么无需直接和做菜所需的原料,厨具,还有菜直接交互,这里所有的过程直接有厨师完成,我们直接跟厨师交互就可以了,这样就会让整个过程变得非常简单,如图二。
图一:
图二:
在软件开发的过程中,为完成一个复杂的功能,一个客户类需要和多个类交互来完成这一功能,使得客户端的处理信息的量剧增,不好维护,就像客户买股票一样,在客户端客户需要和多只股票类产生交互,这样使得处理特别麻烦,耦合性很高,我们这时就需要引入一个外观类,他为多个业务类的调用提供了统一的入口,通过这个类,让客户直接和这一个类交互就可以了,然后让这个类去实现和多个业务类之间的交互,就像吃饭的时候我直接找厨师就可以了,不需要自己去和多种食材,厨具交互,降低耦合,为什么这样说呢?就像做饭一样,当我买来的菜变了,我所使用的材料就可能不一样,所用的厨具也要发生相应的变化,这就是耦合,一个类的变化会影响到其他的类,为了简单,降低耦合,我直接找个厨师就OK!
外观模式实现
结构类图:
一般实现代码,以买股票为例:
定义一个外观类,即基金类,需要了解各个股票的方法或属性。
//基金类
class Fund
{
Stock1 gu1;
Stock2 gu2;
//Stock3 gu3;
public Fund()
{
gu1 = new Stock1();
gu2 = new Stock2();
}
public void BuyFund()
{
gu1.Buy();
gu2.Buy();
}
Fund jijin = new Fund();
//基金购买
jijin.BuyFund();
//基金赎回
jijin.SellFund();
Console.Read();
什么时候使用?
1.在设计的初级阶段,应该有意识地将不同的两个层分离,在层与层之间建立外观,这样可以为复杂的子系统提供一个简单的接口,降低耦合。
2.在开发阶段,子系统因为不断地重构而变得越来越复杂,通过增加外观,可以提供一个简单的接口,减少他们之间的依赖。
3.在维护一个遗留的大型系统的时候,可能这个系统已经很难维护和扩展了,可以为新系统开发一个外观类,来提供设计粗糙或高度复杂的遗留代码的比较清新简单的接口,让新系统和外观对象交互,Facade与遗留代码交互所有复杂的工作。
总结
外观模式就是为一个系统定义了一个接口,用户通过这一个接口就可以完成各个子系统复杂的功能。