1、结构图
2、代码
/*************************************************************
* 意图:为子系统中的一组接口提供一个一致的界面,Facade 模式
* 定义了一个高层接口,这个接口使得这一子系统更加容易使用。
*
* 适用性:
* 1、当你要为一个复杂子系统提供一个简单接口时。子系统往往因为
* 不断演化而变得越来越复杂。大多数模式使用时都会产生更多更
* 小的类。这使得子系统更具可重用性,也更容易对子系统进行定
* 制,但这也给那些不需要定制子系统的用户带来一些使用上的困
* 难。Facade 可以提供一个简单的缺省视图,这一视图对大
* 多数用户来说已经足够,而那些需要更多的可定制性的用户可以
* 越过facade层。
* 2、客户程序与抽象类的实现部分之间存在着很大的依赖性。引入
* facade 将这个子系统与客户以及其他的子系统分离,可以提高
* 子系统的独立性和可移植性。
* 3、当你需要构建一个层次结构的子系统时,使用facade 模式定义
* 子系统中每层的入口点。如果子系统之间是相互依赖的,你可以
* 让它们仅通过facade 进行通讯,从而简化了它们之间的依
* 赖关系。
*
* 协作:
* 1、客户程序通过发送请求给Facade的方式与子系统通讯,Facade将这些
* 消息转发给适当的子系统对象。尽管是子系统中的有关对象在做实际
* 工作,但Facade模式本身也必须将它的接口转换成子系统的接口。
* 2、使用Facade的客户程序不需要直接访问子系统对象。
*
* 作者:董怀信
* 日期:2009-06-04
* **********************************************************/
using System;
namespace DesignPattern.StructuralPattern.Facade
{
/// <summary>
/// 知道哪些子系统类负责处理请求。
/// 将客户的请求代理给适当的子系统对象。
/// </summary>
public class Facade
{
private bool m_runClassA = false;
private bool m_runClassB;
public bool RunClassA
{
get
{
return m_runClassA;
}
set
{
m_runClassA = value;
}
}
public bool RunClassB
{
get
{
return m_runClassB;
}
set
{
m_runClassB = value;
}
}
public void OperationWrapper()
{
Console.WriteLine("Facade OperationWrapper Start;");
if (m_runClassA)
{
SubSystemClassA classA = new SubSystemClassA();
classA.Operation();
}
if (m_runClassB)
{
SubSystemClassB classB = new SubSystemClassB();
classB.Operation();
}
Console.WriteLine("Facade OperationWrapper End");
}
}
/// <summary>
/// 实现子系统的功能。
/// 处理由Facade对象指派的任务。
/// 没有Facade的任何相关信息;即没有对Facade的引用(或指针)
/// </summary>
public class SubSystemClassA
{
public void Operation()
{
Console.WriteLine("SubSystemClassA:Operation();");
}
}
public class SubSystemClassB
{
public void Operation()
{
Console.WriteLine("SubSystemClassB:Operation();");
}
}
}