门面模式(Facade)
系统间耦合的复杂度
对于客户系统和子系统之前存在很多的耦合的情况,如果不考虑设计的情况,那么会形成A方案的情况,系统的依赖严重,维护性大大降低。
如果在客户层和子系统之间添加一层Facade,那么客户系统之和Facade打交道,子系统中也只和Facade打交道,那么在这时候,也就减少了客户和自系统的依赖程度,相对使两个系统更加独立,可维护提高。
动机
上述方案A的问题在于组件的客户和组件中的各种复杂的子系统有了过多的耦合,随着外部客户程序和子系统的演化,这种过多的耦合面临很多变化的挑战。
为子系统中的一组接口提供一个一致(稳定)的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(复用)。
对于Facade来说其实没有固定的结构可循,很多时候看起来代码差别很大情况,但都是Facade模式。
而Facade更多的表达是一种设计原则和思想。
比如数据库的访问层(持久层的接口)就是一种典型的Facade模式。
代码
例如有一堆用户类、创建一个用户的门面类管理这些用户类的接口
// 用户类
interface UserHandle1 {
void f1();
}
interface UserHandle2 {
void f2();
}
interface UserHandle3 {
void f3();
}
// 用户抽象工厂类、用于生成用于操作
interface UserHandleAbstractFactory {
UserHandle1 createUserHandle1();
UserHandle2 createUserHandle2();
UserHandle3 createUserHandle3();
}
// 用户门面类
class UserFacade {
public UserHandle1 handle1;
public UserHandle2 handle2;
public UserHandle3 handle3;
public UserFacade(UserHandleAbstractFactory userHandleAbstractFactory) {
handle1 = userHandleAbstractFactory.createUserHandle1();
handle2 = userHandleAbstractFactory.createUserHandle2();
handle3 = userHandleAbstractFactory.createUserHandle3();
}
void f1() {
handle1.f1();
}
void f2() {
handle2.f2();
}
void f3() {
handle3.f3();
}
}
要点总结
从客户程序角度来看,Facade模式简化了整个组建系统的接口,对于组建内部与外部客户程序来说,达到了一种“解耦”的效果——内部子系统的任何变化不会影响到Facade接口的变化。
Facade设计模式更注重从构架的层次去看整个系统,而不是单个类的层次,Facade很多时候更是一种架构设计的模式
Facade设计模式并非一个集装箱,可以任意的放入任何多个对象。Facade模式中组件的内部应该是“相互耦合关系比较大的一系列组件”,而不是简单的功能集合,以便能够实现松耦合,高内聚的特性。