系统的复杂度:
假设我们需要开发一个坦克模拟系统用于坦克车的各种作战环境中的行为,其中坦克引擎、控制器、车轮、车身等子系统构成。
方案:
动机(Motivation)
上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多地耦合,随着外部客户程序和各子系统的演化,这种过多地耦合面临很多变化的挑战。
意图(Intent)
为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
结构(Structure)
代码实现:
1 内部类 2 internal class Wheel 3 { 4 private int _num; 5 6 public int Num 7 { 8 get { return _num; } 9 set { _num = value; } 10 } 11 public Wheel(int num) 12 { 13 this.Num = num; 14 } 15 public void WAction() 16 { 17 Console.WriteLine("轮子{0}工作",this.Num); 18 } 19 } 20 internal class Engine 21 { 22 private int _num; 23 24 public int Num 25 { 26 get { return _num; } 27 set { _num = value; } 28 } 29 public Engine(int num) 30 { 31 this.Num = num; 32 } 33 public void EAction() 34 { 35 Console.WriteLine("引擎{0}工作",this.Num); 36 } 37 } 38 internal class Bobywork 39 { 40 private int _num; 41 42 public int Num 43 { 44 get { return _num; } 45 set { _num = value; } 46 } 47 public Bobywork(int num) 48 { 49 this.Num = num; 50 } 51 public void BAction() 52 { 53 Console.WriteLine("车身{0}工作",this.Num); 54 } 55 } 56 internal class Controller 57 { 58 private int _num; 59 60 public int Num 61 { 62 get { return _num; } 63 set { _num = value; } 64 } 65 public Controller(int num) 66 { 67 this.Num = num; 68 } 69 public void CAction() 70 { 71 Console.WriteLine("控制器{0}工作",this.Num); 72 } 73 }
1 高层接口 2 public class TankFacade 3 { 4 private Wheel[] wheels=new Wheel[4]{ 5 new Wheel(1), 6 new Wheel(2), 7 new Wheel(3), 8 new Wheel(4) 9 }; 10 private Engine[] engines = new Engine[2]{ 11 new Engine(1), 12 new Engine(2) 13 }; 14 private Bobywork bodywork=new Bobywork(1); 15 private Controller controller=new Controller(1); 16 public void Run() 17 { 18 foreach (Wheel item in wheels) 19 { 20 item.WAction(); 21 } 22 foreach (Engine item in engines) 23 { 24 item.EAction(); 25 } 26 bodywork.BAction(); 27 } 28 public void Shot() 29 { 30 foreach (Engine item in engines) 31 { 32 item.EAction(); 33 } 34 bodywork.BAction(); 35 controller.CAction(); 36 } 37 }
1 主函数的调用 2 static void Main(string[] args) 3 { 4 TankFacade facade = new TankFacade(); 5 facade.Run(); 6 Console.WriteLine("--------------------"); 7 facade.Shot(); 8 Console.ReadKey(); 9 }
Facade模式的几个要点:
从客户程序的角度来看,Facade模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦”的效果--内部子系统的任何变化不会影响到Facade接口的变化。
Facade模式更注重从架构的层次去看整个系统,而不是单个类的层次。Facade很多时候更是一种架构设计模式。
注意区分Facade模式、Adapter模式、Bridge模式与Decorator模式。Facade模式注重简化接口,Adapter模式注重转换接口,Bridge模式注重分离接口(抽象)与其实现,Decorator模式注重稳定接口的前提下为对象扩展功能。