动机:有些系统组件的客户和组件中各类复杂的子系统有了过多的的耦合,随着外部客户程序
和个子系统的演化,这种过多的耦合面临不少变化的挑战;如何简化外部客户程序和系统的交互接口?
如何将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦
意图:为子系统的一组接口提供一个一致的界面,Facade模式定义了了一个高层接口,这个接口使得这一子系统更加
容易使用spa
可适用性:
一、当你要为一个复杂子系统提供一个简单接口时。子系统每每由于不断演化而变得愈来愈复杂。大多数模式使用时都会
产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不须要定制子系统的用
户带来一些使用上的困难。Facade能够提供一个简单的缺省视图,这一视图对大多数用户来讲已经足够,而那
些须要更多的可定制性的用户能够越过Facade层。
二、客户程序与抽象类的实现部分之间存在着很大的依赖性。引入Facade将这个子系统与客户以及其余的子系统
分离,能够提升子系统的独立性和可移植性。
三、当你须要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。若是子系统之间是相
互依赖的,你可让它们仅经过Facade进行通信,从而简化了它们之间的依赖关系。设计
UML图解:对象
示例:假设咱们须要开发一个坦克模拟系统用于模拟坦克车在各类做战环境中的行为,其中坦克系统由引擎、控制器、车轮、车身等各类子系统构成。blog
代码以下:接口
namespace Facade { /// <summary> /// 车轮 /// </summary> public class Wheel { public void WAction1() { } public void WAction2() { } } /// <summary> /// 引擎 /// </summary> public class Engine { public void EAction1() { } public void EAction2() { } } /// <summary> /// 控制器 /// </summary> public class Controler { public void CAction1() { } public void CAction2() { } } /// <summary> /// 车身 /// </summary> public class Bodywork { public void BAction1() { } public void BAction2() { } } /*假设将以上每一个类看作是各个子系统的话,下面就用Facade模式设计一个高层的系统*/ /// <summary> /// 设计好TankFacade类,这样就能够将系统解耦,咱们使用坦克时并不须要关注其引擎、控制器、车轮、 /// 车身具体怎么工做的咱们只须要知道坦克能作什么就能够,TankFacade类简化了客户程序使用的复杂性 /// ,也同时隐藏了子系的内部实现,以对象组合的方式来达到解耦的目的;虽然子系统和TankFacade同在 /// 一个DLL里,但客户程 序只能透过TankFacade类来使用各个子系统的功能 /// </summary> public class TankFacade { Wheel[] wheels=new Wheel[4]; Engine[] engines = new Engine[4]; Bodywork body = new Bodywork(); Controler control = new Controler(); public void Start() { //使用子系统Engine的某些方法... } public void Run() { //使用子系统Wheel的某些方法... } public void Shot() { //.... } public void Stop() { //.... } } }