Java设计模式之外观模式
外观模式也叫门面模式。
考虑这样一个业务场景,商城里面有积分兑换功能,比如1000积分可以兑换一个键盘等。这里可以拆分出三个子系统, 积分数量和礼物库存校验子系统,积分支付子系统,物流子系统。
//创建积分礼物类
public class PointGift {
private String name;
public PointGift(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
//第一个子系统 校验积分是否足够,校验库存是否足够
public class QualityService {
public boolean isAvailable(PointGift pointGift){
System.out.println(pointGift.getName()+" 积分满足,库存满足!");
return true;
}
}
//第二个子系统,积分支付系统
public class PointPaymentService {
public boolean pay(PointGift pointGift){
System.out.println(pointGift.getName()+" 积分支付成功");
return true;
}
}
//第三个子系统,物流子系统
public class ShippingService {
public String shipGift(PointGift pointGift){
System.out.println(pointGift.getName()+"进入物流系统");
String shippingOrderNo="666";
return shippingOrderNo;
}
}
//外观模式类,调用三个子系统
public class GiftExchangeService {
private QualityService qualityService=new QualityService();
private PointPaymentService paymentService=new PointPaymentService();
private ShippingService shippingService=new ShippingService();
public void giftExchange(PointGift pointGift){
//校验积分数量和库存
if (qualityService.isAvailable(pointGift)){
//积分支付是否成功
if (paymentService.pay(pointGift)){
String shippingOrderNo=shippingService.shipGift(pointGift);
System.out.println("物流系统下单成功,订单号是:"+shippingOrderNo);
}
}
}
}
//应用层调用外观模式类
public class Test {
public static void main(String[] a){
PointGift pointGift =new PointGift("键盘");
GiftExchangeService giftExchangeService=new GiftExchangeService();
giftExchangeService.giftExchange(pointGift);
}
}
//结果:
键盘 积分满足,库存满足!
键盘 积分支付成功
键盘进入物流系统
物流系统下单成功,订单号是:666
下面是UML的类图,从类图可以看出,应用层没有直接调用三个子系统,应用层只关心积分兑换功能,不关心三个子系统的具体实现以及调用方法,而这些都被封装在外观模式类GiftExchangeService,应用层直接调用外观模式类即可。与此同时,这也是遵循了迪米特法则,只需要知道该知道的。当然,如果需要新增子系统,就需要修改外观模式类,这样就违反了开闭原则。