定义
提供一个统一的接口,用来访问子系统的一群接口,定义了一个高级接口,让子系统更容易使用
适用场景
- 子系统越来越复杂,增加门面模式提供简单接口
- 构建多层系统结构,利用门面模式作为每层的入口,简化调用层
门面模式的实例
public class Login {
private String userName;
public Login(String userName) {
this.userName = userName;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void login2page() {
System.out.println("用户已登录:" + userName);
}
}
public class Pay {
private int amount;
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
public Pay(int amount) {
this.amount = amount;
}
public void pay2super() {
System.out.println("支付金额:" + amount);
}
}
public class Shipment {
private String ShipNo;
public String getShipNo() {
return ShipNo;
}
public void setShipNo(String shipNo) {
ShipNo = shipNo;
}
public Shipment(String shipNo) {
ShipNo = shipNo;
}
public void ship2user() {
System.out.println("发货成功:"+ ShipNo);
}
}
// 门面类
public class PurchaseGoodsFacade {
private Login login = new Login("ya");
private Pay pay = new Pay(11);
private Shipment shipment = new Shipment("666");
public void purchaseGoods() {
if(login.getUserName() != null && !login.getUserName().isEmpty()) {
login.login2page();
if (String.valueOf(pay.getAmount()) != null) {
pay.pay2super();
if (shipment.getShipNo() != null) {
shipment.ship2user();
}
}
}
}
public static void main(String[] args) {
PurchaseGoodsFacade facade = new PurchaseGoodsFacade();
facade.purchaseGoods();
}
}
应用
- jdbcUtil - supportsBatchUpdates
- mybatis - configuration- newMeta
- tomcat
与其他设计模式区别
- 代理模式
- 特殊的静态代理
- 门面模式重点在于封装
- 静态代理在于增强
- 单例模式
- 一般门面模式会设计成单例模式
优点
- 简化调用过程
- 减少系统依赖,松散耦合
- 更好的划分层次,提高安全性
- 最少知道原则
缺点
- 子系统扩展子系统行为时可能带来危险
- 不符合开闭原则
- 某些情况违背单一职责原则