外观模式——为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式是指当有很多的类,它们实现不同的功能,可能出现很多种的组合功能,需要在客户端不停的去实现,造成了客户端责任不单一,代码过多、重复、易变等问题,外观模式可以解决这一问题。
1.SubSystem类,子系统,包含了很多的功能实现,要实现这些功能需要在客户端创建这些组合
1 /// <summary> 2 /// 子系统1 3 /// </summary> 4 public class SubSystemOne 5 { 6 public void MethodOne() 7 { 8 //子系统方法1 9 } 10 } 11 12 /// <summary> 13 /// 子系统2 14 /// </summary> 15 public class SubSystemTwo 16 { 17 public void MethodTwo() 18 { 19 //子系统方法2 20 } 21 } 22 23 /// <summary> 24 /// 子系统3 25 /// </summary> 26 public class SubSystemThree 27 { 28 public void MethodThree() 29 { 30 //子系统方法3 31 } 32 } 33 34 /// <summary> 35 /// 子系统4 36 /// </summary> 37 public class SubSystemFour 38 { 39 public void MethodFour() 40 { 41 //子系统方法4 42 } 43 }
2.Facade类,外观类,使各个子系统进行整合,统一给外界调用,它需要了解所有子系统的方法或者属性,进行组合,以备外界调用
1 /// <summary> 2 /// 外观类 3 /// </summary> 4 public class Facade 5 { 6 //子系统 7 private readonly SubSystemOne _one; 8 private readonly SubSystemTwo _two; 9 private readonly SubSystemThree _three; 10 private readonly SubSystemFour _four; 11 12 /// <summary> 13 /// 构造方法进行创建子系统 14 /// </summary> 15 public Facade() 16 { 17 _one=new SubSystemOne(); 18 _two=new SubSystemTwo(); 19 _three=new SubSystemThree(); 20 _four =new SubSystemFour(); 21 } 22 23 /// <summary> 24 /// 组合方式A 25 /// </summary> 26 public void MethodA() 27 { 28 _one.MethodOne(); 29 _two.MethodTwo(); 30 _three.MethodThree(); 31 } 32 33 /// <summary> 34 /// 组合方式B 35 /// </summary> 36 public void MethodB() 37 { 38 _two.MethodTwo(); 39 _four.MethodFour(); 40 } 41 }
3.客户端代码,不必知道子系统的实现方法,甚至根本不必只有有这么多子系统,就可以实现功能
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 //创建外观对象 6 var facade = new Facade(); 7 //让外观类实现组合A的功能 8 facade.MethodA(); 9 //让外观类实现组合B的功能 10 facade.MethodB(); 11 } 12 }
外观模式使用情况比较多,大致分为以下三种:
(1)在项目设计初期阶段,有意识的将不同的层分离,在层与曾之间建立外观模式,降低耦合性;
(2)在开发阶段,子系统往往因为不停的重构烟花而变得越来越复杂,增加外观模式可以提供一个简单的接口,减少它们的依赖;
(3)在维护一个遗留的大型项目时,可能这个系统已经非常难以维护和扩展了,但因为它包含了非常重要的功能,新的需求必须依靠它,此时使用外观模式,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂工作。
以上内容部分参考程杰的《大话设计模式》一书