文章目录
1、定义
门面模式(Facade Pattern):门面模式又被称为外观模式,它要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。该模式提供了一个高层次的接口,使得子系统更易使用。
2、形式
门面模式通用类图如下所示:
其中:
- 为门面角色,知晓子系统的所有功能和责任,供客户端进行调用。该角色实际为一个委托类,将客户端发出的请求委派到相应的子系统去进行处理。
-
Subsystem
为子系统角色,子系统可以同时有一个或多个,门面对于子系统来说并不存在,这只是它的另外一个客户端而已。
门面模式注重用统一的对象,也即提供一个访问子系统的接口,除该接口外不允许有任何访问子系统的行为发生。更直观的来说就是门面对象是外界访问子系统的唯一通道(房子和门)。
示例代码如下:
Subsystem
:包含三个类模块
public class A{
public void doSomething(){
//业务逻辑
}
}
public class B{
public void doSomething(){
//业务逻辑
}
}
public class C{
public void doSomething(){
//业务逻辑
}
}
Facade
public class Client {
//委托的子系统对象
private A a= new A();
private B b= new B();
private C c= new C();
//提供外部访问的方法
public void methodA(){
this.a.doSomething();
}
public void methodB(){
this.b.doSomething();
}
public void methodC(){
this.c.doSomething();
}
}
3、优缺点
优点
- 减少系统的相互依赖,门面模式构成了系统内部的弱耦合。
- 提高了灵活性,系统内部只要不影响到门面对象,可以*变化
- 提高了安全性,子系统的业务无法随意访问
缺点:
- 门面模式不符合开闭原则(java消息通知默认是顺序执行),一旦系统投产后发现门面对象存在错误,只能通过修改门面角色的代码来改正错误,风险很大。
4、使用场景
- 为一个复杂的模块或子系统提供一个供外界访问的接口
- 子系统相对独立,外界对子系统的访问只要黑箱操作即可
- 预防低水平人员带来的风险扩散,把风险降低在子系统内部
使用门面模式还需要注意下面几个问题:
1)一个子系统可以有多个门面
当遇到下面几种情况时,子系统可以包含多个门面:
-
门面对象过于庞大
-
子系统可以提供不同的访问路径
例如对上面的示例代码,现在有一个模块只能访问只系统中的
methodA
方法,因此可以新增门面供该模块访问。示例代码如下:public class Facade2{ //引用原有门面 private Facade facade = new Facade(); public void methodB(){ this.facade.methodB(); } }
2)门面不参与子系统内的业务逻辑
无论什么场景,都不要让门面参与具体的业务逻辑,否则会产生一个倒依赖的问题,子系统必须依赖门面才能访问,这不仅违反了单一职责原则,也破坏了系统的封装性。总的来说,所有的业务逻辑必须封装在子系统内部,门面只给外界提供访问子系统的接口。
5、小结
门面模式是一个很好的封装策略,可以有效提高系统的扩展性,降低人员引起的技术风险,但使用要谨慎,尽量避免门面对象出现错误。