本篇文章主要参考《大话设计模式》相关章节
外观模式
外观模式为子系统中的接口提供了一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
UML
● 外观(Facade) :客户端可以调用Facade中提供的方法。Facade了解子系统群中可实现的功能。外观的名称我个人觉得是代表整个子系统群向Client端展示一个总接口,Facade接口按照Client端的不同需求对子系统中的功能进行整合,Client直接使用这些整合好的接口,从而实现简化自己对子系统群的访问的目标。
● 子系统(SubSystem):可以同时有一个或者多个子系统。每个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已。功能上,每个子系统都实现了一个独立的功能,与其他子系统在逻辑上没有交叉。
关于外观模式核心的作用,用下图来解释更好理解:
未使用外观模式的逻辑中,每个Client为了实现一个目标,需要亲自和子系统群中的各个子模块进行交互,逻辑复杂,每次调用都涉及多个子模块。
使用了外观模式之后,一个Client为实现一个目标,所需要进行的复杂交互逻辑,全部转移到Facade接口中,Client直接调用Facade中对应的接口就可以,且可以供其他多个Client使用。
简而言之,外观模式极大简化了Client端对子系统群的访问和使用。
示例代码:
子系统类群:
class SubSystemOne
{
public void MethodOne()
{
}
}
class SubSystemTwo
{
public void MethodTwo()
{
}
}
class SubSystemThree
{
public void MethodThree()
{
}
}
class SubSystemFour
{
public void MethodFour()
{
}
}
外观类:
class Facade
{
SubSystemOne one;
SubSystemTwo two;
SubSystemThree three;
SubSystemFour four;
public Facade(SubSystemOne one, SubSystemTwo two,
SubSystemThree three, SubSystemFour four)
{
this.one = one;
this.two = two;
this.three = three;
this.four = four;
}
public void MethodA()
{
one.MethodOne();
two.MethodTwo();
Four.MethodFour();
}
public void MethodA()
{
one.MethodOne();
two.MethodTwo();
Four.MethodFour();
}
}
客户端调用:
static void Main(){
Facade facade = new Facade(new SubSystemOne(), new SubSystemTwo(),
new SubSystemThree(), new SubSystemFour());
facade.MethodA();
facade.MethodB();
}
代理模式和外观模式的主要区别:
区别一:代理对象代表一个单一对象,而外观对象代表一个子系统;
区别二:代理的客户对象无法直接访问目标对象,有代理提供对单独的目标对象的访问控制;而外观的客户对象可以直接访问子系统中的各个对象,但通常有外观对象提供对子系统个原件功能的简化的共同层次的调用接口。
外观模式和适配器模式的区别:
形式上:外观定义的是一个新的接口,而适配器则是复用一个原有的接口;
功能上:适配器是使两个已有的接口协同工作,而外观则是为现存系统提供一个更为方便的访问接口。