意图
- 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
适用性
- 当你想要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具有可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过Facade层;
- 客户程序与抽象类的实现部分之间存在着很大的依赖性。引入facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
- 构建一个层次结果的子系统,使用facade模式定义子系统中每层的入口点。如果子系统之间时相互依赖的,你可以让他们仅通过facade进行通讯,从而简化了它们之间的依赖关系;
结构
参与者
- Facde
- 知道哪些子系统类负责处理请求
- 将客户的请求代理给适当的子系统对象
- Subsystem classes
- 实现子系统的功能
- 处理由Facade对象指派的任务
- 没有facade的任何相关信息
协作
- 客户程序通过发送请求给Facade的方式与子系统通讯,Facade将这些消息转发给适当的子系统对象。尽管是子系统中有关对象在做实际工作,但facade模式本身也必须将它的接口转换成子系统的接口;
- 使用facade的客户程序不需要直接访问子系统的对象
效果
- 它对客户屏蔽子系统组件,因此而减少了客户处理的对象的数目并使得子系统使用起来更加方便。
- 它实现了子系统与客户之间的送耦合关系,而子系统内部的功能组件往往是紧耦合的。
- 如果应用需要,并不限制它们使用子系统类,因此可以在系统易用性和通用性做选择;
实现
- 降低客户与子系统之间的耦合度
- 公共子类与私有子类
代码示例
class FacadeStructure
{
public void Test()
{
Facade facade = new Facade();
facade.OperationAB();
facade.OperationCD();
}
}
class SubsystemA
{
public void Operation()
{
Console.WriteLine(this.GetType().Name+"---Operation");
}
}
class SubsystemB
{
public void Operation()
{
Console.WriteLine(this.GetType().Name + "---Operation");
}
}
class SubsystemC
{
public void Operation()
{
Console.WriteLine(this.GetType().Name + "---Operation");
}
}
class SubsystemD
{
public void Operation()
{
Console.WriteLine(this.GetType().Name + "---Operation");
}
}
class Facade
{
private SubsystemA _a;
private SubsystemB _b;
private SubsystemC _c;
private SubsystemD _d;
public Facade()
{
_a = new SubsystemA();
_b = new SubsystemB();
_c = new SubsystemC();
_d = new SubsystemD();
}
public void OperationAB()
{
_a.Operation();
_b.Operation();
}
public void OperationCD()
{
_c.Operation();
_d.Operation();
}
}
相关模式
Abstract Factory模式可以与Facade模式一起使用以提供一个接口,这一接口可用来以一种子系统独立的方式创建子系统对象。Abstract Factory也可以代替Facade模式隐藏那些与平台相关的类;
Mediator模式与facade模式的相似之处是它抽象了一些已有的类的功能。然而,Mediator的目的是对同事之间的任意通讯进行抽象,通常集中不属于任何单个对象的功能。Mediator的同事对象知道中介者并于它通信,而不是直接与其他同类对象。相对而言,Facade不仅对子系统对象的接口进行抽象,从而使它们更容易使用;它并不定义新功能,子系统也不知道facade的存在。