理解门面模式
2019-08-22 本文已影响0人
饿了爸
1 门面设计模式介绍
要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。最核心的目的:简化子系统,简化客户使用,屏蔽多个子系统


1.1 应用场景
A:简化子系统复杂性时。
B:监控所有子系统时;通过门面控制了入口,可以统一监控;
C:希望封装和隐藏子系统时;
D:两历史系统进行改造并打通关系时;
1.2 优缺点
优点:
- 松耦合
- 用户与子系统解耦,屏蔽子系统;可以提高子系统的独立性;
- 使用简单
- 简化用户与子系统的依赖关系;
- 用户只与门面对接,有统一的入口;不需要知道所有子系统及内部构造;
缺点:
- 不规范的编程方式
- 没有面向抽象编程,而是通过增加中介层,转换服务提供方的服务接口;
2 代码实现
子系统角色中的类:
public class ModuleA {
//示意方法
public void testA(){
System.out.println("调用ModuleA中的testA方法");
}
}
public class ModuleB {
//示意方法
public void testB(){
System.out.println("调用ModuleB中的testB方法");
}
}
public class ModuleC {
//示意方法
public void testC(){
System.out.println("调用ModuleC中的testC方法");
}
}
门面角色类
public class Facade {
//示意方法,满足客户端需要的功能
public void test(){
ModuleA a = new ModuleA();
a.testA();
ModuleB b = new ModuleB();
b.testB();
ModuleC c = new ModuleC();
c.testC();
}
}
public class ModuleFacade {
ModuleA a = new ModuleA();
ModuleB b = new ModuleB();
ModuleC c = new ModuleC();
/**
* 下面这些是A、B、C模块对子系统外部提供的方法
*/
public void testA(){
a.testA();
}
public void testB(){
b.testB();
}
public void testC(){
c.testC();
}
}
客户端角色类
public class Client {
public static void main(String[] args) {
Facade facade = new Facade();
facade.test();
ModuleFacade mfacade = new ModuleFacade ()
mfacade.testA();
}
}
3 开源框架中的应用
3.1 Netty bootstrap
3.2 activiti ProcessEngine
3.3 log4j
4 其他注意事项
4.1 与代理模式区别
相似点:
- 都引入了中介类(对象)
- 中介对象都引用并把功能委托给了原对象
- 都起到了”代理”功能
区别
- 代理侧重于对原对象的访问控制(当然也可以不是控制而是功能增强)
- 代理与原类实现相同的抽象(相同接口或直接继承原业)
- 代理只代理一个类
- 门面侧重于功能整合(多个小系统或小对象整合成一个功能丰富的大对象)
- 门面可以与子系统具有不同的抽象(具有不同的接口,可以对方法重新起名)
- 门面代理的是一系列类