-
Facade Pattern
-
在外观模式中,外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。
-
Facade模式角色分析:
-
Facade角色: 是在客户端直接调用的角色,在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任,它将所有从客户端发来的请求委派到相应的子系统去,传递给相应的子系统对象处理;
-
Subsystem classes 子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能。
外观模式也是“迪米特法则”的体现,通过引入一个新的外观类可以降低原有系统的复杂度,同时降低客户类与子系统类的耦合度。
-
外观模式适用情况包括:
要为一个复杂子系统提供一个简单接口;客户程序与多个子系统之间存在很大的依赖性;在层次化结构中,需要定义系统中每一层的入口,使得层与层之间不直接产生联系。 -
代码示例
/*
* facade Pattern
*
*/
using System;
using System.Collections.Generic;
namespace Pattern03
{
class Program
{
static void Main(string[] args)
{
Facade facade = new Facade();
facade.MethodA();
facade.MethodB();
Console.ReadKey();
}
}
/// <summary>
/// Facade
/// </summary>
class Facade
{
public SubsysClassA _one;
public SubsysClassB _two;
public SubsysClassC _three;
public SubsysClassD _four;
public Facade()
{
_one = new SubsysClassA();
_two = new SubsysClassB();
_three = new SubsysClassC();
_four = new SubsysClassD();
}
public void MethodA()
{
Console.WriteLine("facade methodA()");
_one.MethodOne();
_two.MethodTwo();
_three.MethodThree();
}
public void MethodB()
{
Console.WriteLine("facadec methodB()");
_three.MethodThree();
_four.MethodFour();
}
}
class SubsysClassA
{
public void MethodOne()
{
Console.WriteLine(" SubsysClassA method");
}
}
class SubsysClassB
{
public void MethodTwo()
{
Console.WriteLine(" SubsysClassB Method Two");
}
}
class SubsysClassC
{
public void MethodThree()
{
Console.WriteLine("SubsysClassC Method Three");
}
}
class SubsysClassD
{
public void MethodFour()
{
Console.WriteLine("SubsysClassD Method Four");
}
}
}
-
类图
-
迪米特法则
迪米特法则(Law of Demeter)又叫作最少知识原则(LKP,Least Knowledge Principle),就是说一个对象应当对其它对象有尽可能少的了解,类与类之间的了解的越多,关系越密切,耦合度越大,当一个类发生改变时。还有一个类也可能发生变化。