9.1外观模式定义:
提供了一个统一的接口,用来访问子系统中的一群接口。外观模式定义了一个高层接口,让子系统更加容易使用。
9.2外观模式UML类图:
9.3应用场景:
生活中其实有许多外观模式,例如我们去自动取款机取钱,和我们打交道的是取款机(相当于银行一系列复杂子系统的Facade),当我们按下取款按键,对应于银行内部的操作至少有:1、验证密码正确性。2、验证金额正确性。3、把钱从你的帐户上划出。4、从取款机中吐出现金等等一系列操作。这里的每一个操作都可以看成是一个个小的子系统。而取款人(Client)不是直接和银行内部的各个的子系统的接口打交道,而是只和各子系统的“代言人”取款机(Façade)打交道,取款机相当于将银行内部一系列复杂的子系统接口隐藏起来,而只是提供一个相对简单的接口(这里对应取款按键)给客户。
9.4外观模式分析与实现(c#描述):
//外观
public class Facade
{
SubSystem1 lobj_SubSystem1;
SubSystem2 lobj_SubSystem2;
SubSystem3 lobj_SubSystem3;
public Facade(SubSystem1 aobj_SubSystem1, SubSystem2 aobj_SubSystem2, SubSystem3 aobj_SubSystem3)
{
this.lobj_SubSystem1 = aobj_SubSystem1;
this.lobj_SubSystem2 = aobj_SubSystem2;
this.lobj_SubSystem3 = aobj_SubSystem3;
}
public void Do()
{
lobj_SubSystem1.Method1();
lobj_SubSystem2.Method1();
lobj_SubSystem3.Method1();
}
}
//子系统1
public class SubSystem1
{
public void Method1()
{
System.Console.WriteLine("Hello,SubSystem1");
}
}
//子系统2
public class SubSystem2
{
public void Method1()
{
System.Console.WriteLine("Hello,SubSystem2");
}
}
//子系统3
public class SubSystem3
{
public void Method1()
{
System.Console.WriteLine("Hello,SubSystem3");
}
}
//调用类
public class Facade_Test
{
public static void Do()
{
Facade lobj_Facade = new Facade(new SubSystem1(),new SubSystem2(),new SubSystem3());//客户只和Facade打交道。
lobj_Facade.Do();//隐藏子系统一系列复杂接口,只留一个简单接口暴露给客户。
}
}
外观模式遵守了一个重要的设计原则:最少知识原则。
最少知识原则:只和你的密友谈话。
这个原则希望我们在设计的过程中,不要让太多的类耦合在一起,免得修改系统中一部分,会影响到其它部分。如果许多类之间相互依赖,那么这个系统就会变成一个易碎的系统,它需要花许多成本来维护,也会因为太复杂而不容易被其它人了解。
外观模式和适配器模式的区别:外观模式的意图是提供子系统的一个简化接口,而适配器模式的意图是“改变”接口以满足客户的需求。