DesignPattern.Ch12.Facade.Node
引用炒股票与买基金来解释“外观模式”,为用户抽象出复杂业务调用过程,提供一个简单的对外统一调用“接口”。
外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
子系统代码模拟:
Facade.SubSystem.impl.Code
1 class SubSystemOne 2 { 3 public void MethodOne() 4 { 5 Console.WriteLine("子系统方法一。"); 6 } 7 } 8 class SubSystemTwo 9 { 10 public void MethodTwo() 11 { 12 Console.WriteLine("子系统方法二。"); 13 } 14 } 15 class SubSystemThree 16 { 17 public void MethodThree() 18 { 19 Console.WriteLine("子系统方法三。"); 20 } 21 }
外观类模拟:(外观类,需要了解所有子系统的方法和属性,进行组合以备外界使用)
Facade.Code
1 //外观类 2 class Facade 3 { 4 SubSystemOne one; 5 SubSystemTwo two; 6 SubSystemThree three; 7 public Facade() 8 { 9 one = new SubSystemOne(); 10 two = new SubSystemTwo(); 11 three = new SubSystemThree(); 12 } 13 public void FacadeMathodA() 14 { 15 Console.WriteLine("---方法组A()-----"); 16 one.MethodOne(); 17 two.MethodTwo(); 18 } 19 public void FacadeMathodB() 20 { 21 Console.WriteLine("---方法组B()-----"); 22 three.MethodThree(); 23 two.MethodTwo(); 24 } 25 }
用户调用:
Main.Invoker
1 static void Main(string[] args) 2 { 3 Facade facade = new Facade(); 4 facade.FacadeMathodA(); 5 facade.FacadeMathodB(); 6 7 }
对于面向对象有一定了解的朋友,即使没有听说过,也完全有可能在很多时候用到它,因为他完全体现了依赖倒转原则和迪米特法则的思想,所以是非常常用的模式。
何时使用外观模式:
可以分三个阶段来说,首先在设计初期阶段,应该有意识的将不同的两个层分离,比如经典的三层架构,就需要考虑数据访问和业务逻辑层、业务逻辑层和表现层之间建立外观Facade,就可以为负责的子系统提供简单的接口,使得耦合性大大降低。其次,在开发阶段,子系统因为不断的重构而变的越来月复杂,大多数模式都会产生许多小类,这本是好事,但也该外部调用它的用户带来了使用上的困难,增加外观模式,可以提供一个简单的接口,减少他们之间的依赖。第三,在维护阶段,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,但是因为他有非常重要的功能,新功能开发必需依赖它,此时采用外观模式也非常适合,你可以为子系统开发一个Facade类,把遗留的设计粗糙,高度复杂的原有代码,提供一个简单的对外整合的接口,新系统与Facade交互,Facade来完成与复杂的遗留代码交互工作。