一、概述
在系统设计中,某一个系统可能非常庞大,用户要使用该系统就不得不掌握大量的接口,造成使用的不便。这时可以考虑将该系统细分成一系列子系统并使子系统间的耦合降到最低,利用外观模式提供一个外观对象,为这一系列子系统提供一个简单的使用接口,这样用户只需要掌握外观对象上的少量接口即可使用该系统。就以汽车为例,一辆汽车由引擎、车轮、刹车等无数子系统构成,大多数用户在实际使用过程中并不关心这些子系统之间的工作细节,他们只希望能简单的启动、刹车即可。
二、外观模式
外观模式为系统中的一组接口定义了一个高层接口,这个接口使得这一系统更加容易使用。外观模式能有效简化外部程序和系统间的交互接口,将外部程序的演化和内部子系统的变化之间的依赖解耦。其结构图如下:
Facade知道哪些子系统类负责处理请求,并将客户请求代理给适当的子系统对象。
Subsystem classes实现了子系统的功能,处理由Facade对象指派的任务,但并不包含Facade对象的任何信息。
三、示例
我们就拿汽车为例。
首先定义引擎、车轮、刹车等子系统。
1 class Engine 2 { 3 public void Start() 4 { 5 Console.WriteLine("Engine Start"); 6 } 7 } 8 9 class Wheel 10 { 11 public void TurnOn() 12 { 13 Console.WriteLine("Wheel is turned"); 14 } 15 public void Stop() 16 { 17 Console.WriteLine("Wheel is stopped"); 18 } 19 } 20 21 class Braker 22 { 23 public void Brake() 24 { 25 Console.WriteLine("Brake!"); 26 } 27 }
接着定义汽车的Facade对象。
1 class CarFacade 2 { 3 private Engine _engine; 4 private Wheel[] _wheels; 5 private Braker _braker; 6 7 public CarFacade() 8 { 9 _engine = new Engine(); 10 _wheels = new Wheel[4]; 11 for (int i = 0; i < _wheels.Length; i++) 12 { 13 _wheels[i] = new Wheel(); 14 } 15 _braker = new Braker(); 16 } 17 public void Run() 18 { 19 _engine.Start(); 20 foreach (Wheel wheel in _wheels) 21 { 22 wheel.TurnOn(); 23 } 24 } 25 public void Brake() 26 { 27 _braker.Brake(); 28 foreach (Wheel wheel in _wheels) 29 { 30 wheel.Stop(); 31 } 32 } 33 }
这样我们只需要使用Façade对象即可实现对汽车的操作。
1 static void Main(string[] args) 2 { 3 CarFacade car = new CarFacade(); 4 car.Run(); 5 car.Brake(); 6 Console.ReadLine(); 7 }