源代码
GitHub源代码
1.本文目标
本文目标是为了让大家认识并理解外观模式
2.基本套路
定义:又叫门面模式,提供了一个统一的接口,用来访问一个或多个子系统中的一群接口
类型:结构型
选择关键点:子系统对外提供服务是否需要依赖很多的类
设计原则:遵循迪米特
使用概率:60%
难度系数:中
3.适用场景
1.子系统越来越复杂,增加外观模式提供简单调用接口
2.构建多层结构,利用外观对象作为每层的入口,简化层间调用
4.使用步骤
用具体的栗子更容易说明问题,继续往下看
5.举个栗子
我们用具体的代码去更好的理解这个设计模式
5.1栗子说明
- 背景:某电商平台上面有积分可以换小礼物
- 目的:兑换礼物需要走好几个系统(资格兑换子系统,积分支付子系统,物流服务子系统),希望使用外观模式统一管理
5.2使用步骤
实现代码如下:
步骤1.创建积分礼物类
public class PointGift {
private String name;
public PointGift(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
步骤2.创建资格兑换子系统
public class QualifyService {
public boolean isAvailable(PointGift pointsGift){
System.out.println("校验"+pointsGift.getName()+" 积分资格通过,库存通过");
return true;
}
}
步骤3.创建积分支付子系统
public class PointsPaymentService {
public boolean pay(PointGift pointsGift) {
//扣减积分
System.out.println("支付" + pointsGift.getName() + " 积分成功");
return true;
}
}
步骤4. 创建物流服务子系统
public class LogisticsService {
public String shipGift(PointGift pointsGift){
//物流系统的对接逻辑
System.out.println(pointsGift.getName()+"进入物流系统");
String logisticsOrderNo = "666";//物流订单ID
return logisticsOrderNo;
}
}
步骤5. 创建外观类,统一管理上面的3个子系统
public class GiftExchangeService {
private QualifyService mQualifyService = new QualifyService();//资格兑换子系统
private PointsPaymentService mPointsPaymentService = new PointsPaymentService();//积分支付子系统
private LogisticsService mLogisticsService = new LogisticsService();//物流子系统
public void giftExchange(PointGift pointsGift){
if(mQualifyService.isAvailable(pointsGift)){
//资格校验通过
if(mPointsPaymentService.pay(pointsGift)){
//如果支付积分成功
String shippingOrderNo = mLogisticsService.shipGift(pointsGift);
System.out.println("物流系统下单成功,订单号是:"+shippingOrderNo);
}
}
}
}
步骤6. 测试
public static void main(String[] args) {
PointGift pointsGift = new PointGift("鼠标");
GiftExchangeService giftExchangeService = new GiftExchangeService();
giftExchangeService.giftExchange(pointsGift);
}
5.3代码总结思考
就是说兑换这个小礼物需要走3个子系统,然后我们提供一个外观类对象(GiftExchangeService),提供统一的入口,让外观类(GiftExchangeService)去和3个子系统通信,然后我们的应用层(也就是FacadeTest这个类)只需要和外观类通信就完了,应用层(TestFacade)<=>外观类(GiftExchangeService)<=>3个子系统(QualifyService,PointsPaymentService,LogisticsService)
6.优点
- 简化了调用过程,无需了解深入子系统,防止带来风险
- 减少系统依赖,松散耦合(客户端不和子系统直接交流,而是通过外观模式进行交流)
- 更好的划分访问层次
- 符合迪米特法则,即最少知道原则(客户端不需要了解子系统内部的实现,只需要和外观类交互就完了)
7.缺点
- 增加子系统,扩展子系统行为容易引入风险
- 不符合开闭原则
8.总结
本文只是对外观模式进行一个分享,接下来会从创建型模式,结构型模式,行为型模式,这三大类展开一个系列分享,大家可以持续进行关注,信仰年輕的设计模式,蟹蟹啦。