定义:又叫门面模式,提供了一个统一的接口,用来访问子系统中的一群接口
外观模式定义了一个高层接口,让子系统更容易使用
类型:结构型
适用场景
- 子系统越来越复杂,增加外观模式提供简单调用接口
- 构建多层系统结构,利用外观对象作为每层的入口,简化层间调用
优点
- 简化了调用过程,无需了解深入子系统,防止带来风险
- 减少系统依赖,松散耦合
- 更好的划分访问层次
- 符合迪米特法则,即最少知道原则
缺点
- 增加子系统,扩展子系统行为容易引入风险
- 不符合开闭原则
例如积分兑换礼物, 需要校验是否有资格兑换礼物,积分支付是否成功,物流发货;
礼物类
package main.java.structual.facade;
public class Gift {
/** 名称*/
private String name;
/** 库存*/
private int stock;
/** 积分*/
private int points;
public Gift() {
}
public Gift(String name, int stock, int points) {
this.name = name;
this.stock = stock;
this.points = points;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getStock() {
return stock;
}
public void setStock(int stock) {
this.stock = stock;
}
public int getPoints() {
return points;
}
public void setPoints(int points) {
this.points = points;
}
}
资格校验子服务
package main.java.structual.facade;
/**
* 资格校验服务
*/
public class QualificationService {
public boolean isAvaliable(Gift gift) {
if (gift.getPoints() > 1000 && gift.getStock() > 0) {
System.out.println(gift.getName() + "积分校验通过,库存校验通过");
return true;
}
return false;
}
}
积分支付服务
package main.java.structual.facade;
/**
* 积分支付服务
*/
public class PointPaymentService {
public boolean pay(Gift gift) {
// 扣减积分和库存
System.out.println("支付" + gift.getName() + "积分成功");
return true;
}
}
物流服务
package main.java.structual.facade;
import java.util.Random;
/**
* 物流服务
*/
public class ShippingService {
public String shipGift(Gift gift) {
// 对接物流
System.out.println(gift.getName() + "进入物流系统");
// 物流单号
String shipOrderNo = "666666666666";
return shipOrderNo;
}
}
测试类
package main.java.structual.facade;
public class Test {
public static void main(String[] args) {
Gift gift = new Gift("卫衣", 100, 10000);
GiftExchangeService giftExchangeService = new GiftExchangeService();
giftExchangeService.exchange(gift);
}
}