一、门面模式
1、定义
门面模式(Facade Pattern)又称作外观模式
,是指提供一个统一的接口,用来访问子系统中的一群接口,属于结构型设计模式。
门面模式的主要特征是定义了一个高层接口,让子系统更容易使用。
2、结构
(1)模式的结构
主要角色如下:
- 外观角色(Facade):也叫作门面角色,是系统对外的统一接口。
- 子系统角色(SubSystem):可以同时有一个或者多个 SubSystem。每一个 SubSystem都不是一个单独的类,而是一个类的集合。
注意:
子系统类中没有 Facade任何信息,即没有 Facade对象的引用。对于 SubSystem而言,Facade只是另一个客户端,处理 Facade指派的任务。
3、优缺点
优点:
- 简化了调用过程,不用深入了解子系统。
- 减少系统依赖,松耦合。
- 更好的划分访问层次,提高安全性。
- 遵循迪米特法则。
缺点:
- 当增加子系统和画展子系统行为时,可能容易带来未知危险。
- 不符合开闭原则。
- 某些情况下,可能违背了单一职责原则。
4、使用场景
- 为一个复杂的模块或者子系统提供一个简单的供外界访问的接口。
- 希望提高子系统的相对独立性时,可以使用它。
5、在框架源码中使用
- Spring源码中 JDBC模块下的 JdbcUtils类,它封装了与 JDBC相关的所有操作。
- Mybatis源码中 Congiguration类,对 JDBC中关键组件的封装。
二、模式的通用实现
代码如下:
public class FacadePattern {public static void main(String[] args) {ServiceFacade serviceFacade = new ServiceFacade();serviceFacade.doCommon();}
}// 子系统角色
class SubSystemA {public void doA() {System.out.println("doing A");}
}class SubSystemB {public void doB() {System.out.println("doing B");}
}// 外观角色
class ServiceFacade {private SubSystemA subSystemA;private SubSystemB subSystemB;public ServiceFacade() {this.subSystemA = new SubSystemA();this.subSystemB = new SubSystemB();}// 对外接口public void doCommon() {subSystemA.doA();subSystemB.doB();}
}
三、模式的应用实例
以客户通过购买基金(门面)从而获得收益为例。基金经理人操作股票(子系统)交易。
(1)股票(子系统)
public class Stock1 {private String name = "股票1";public void buy(){System.out.println("买进" + name);}public void sell(){System.out.println("卖出" + name);}
}public class Stock2 {private String name = "股票2";public void buy(){System.out.println("买进" + name);}public void sell(){System.out.println("卖出" + name);}
}
(2)基金(门面)
public class FundFacade {private String name = "基金A";private Stock1 stock1;private Stock2 stock2;public FundFacade() {this.stock1 = new Stock1();this.stock2 = new Stock2();}public void buyFund(){System.out.println("买进" + name + ", 基金经理买进的股票如下:");stock1.buy();stock2.buy();}public void sellFund(){System.out.println("卖出" + name+ ", 基金经理卖出的股票如下:");stock1.sell();stock2.sell();System.out.println("收益1W+");}
}
(3)测试:小白购买该基金
public static void main(String[] args) {FundFacade fundFacade = new FundFacade();fundFacade.buyFund();System.out.println("----第N天之后----");fundFacade.sellFund();}
– 求知若饥,虚心若愚。