10-1 外观模式讲解
11-2 装饰者模式coding
有一个积分礼物类:
/** 积分礼物 */
public class PointsGift {
private String name;
public PointsGift(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
校验类:是否有资格
public class QualifyService {
public boolean isAvailable(PointsGift pointsGift) {
System.out.println("校验"+pointsGift.getName()+"积分资格通过,库存通过");
return true;
}
}
积分支付类:
public class PointsPaymentService {
public boolean pay(PointsGift pointsGift) {
/** 扣减积分 */
System.out.println("支付"+pointsGift.getName()+" 积分成功");
return true;
}
}
还要一个物流子系统:
public class ShippingService {
public String shipGift(PointsGift pointsGift) {
/** 物流系统对接逻辑 */
System.out.println(pointsGift.getName() + "进入物流系统");
String shippingOrderNo = "666";
return shippingOrderNo;
}
}
积分交换交易:
public class GiftExchangeService {
private QualifyService qualifyService;
private PointsPaymentService pointsPaymentService;
private ShippingService shippingService;
public void setQualifyService(QualifyService qualifyService) {
this.qualifyService = qualifyService;
}
public void setPointsPaymentService(PointsPaymentService pointsPaymentService) {
this.pointsPaymentService = pointsPaymentService;
}
public void setShippingService(ShippingService shippingService) {
this.shippingService = shippingService;
}
public void giftExchange(PointsGift pointsGift) {
if (qualifyService.isAvailable(pointsGift)) {
/** 资格检验通过 */
if (pointsPaymentService.pay(pointsGift)) {
//如果积分支付成功,那么就是可以返回订单号了
String shippingOrderNo = shippingService.shipGift(pointsGift);
System.out.println("物流订单系统下单成功,订单号是:"+shippingOrderNo);
}
}
}
}
这个就是外观模式的类图:
测试代码:
public class Test {
public static void main(String[]args){
PointsGift pointsGift = new PointsGift("T恤");
GiftExchangeService giftExchangeService = new GiftExchangeService();
giftExchangeService.setQualifyService(new QualifyService());
giftExchangeService.setPointsPaymentService(new PointsPaymentService());
giftExchangeService.setShippingService(new ShippingService());
giftExchangeService.giftExchange(pointsGift);
}
}
运行结果:
校验T恤积分资格通过,库存通过
支付T恤 积分成功
T恤进入物流系统
物流订单系统下单成功,订单号是:666
这个就是现在的类图:
这里和子系统有关联关系是因为没有集成Spring,我们可以模拟一下,在外观类里面直接new出实例:
public class GiftExchangeService {
private QualifyService qualifyService = new QualifyService();
private PointsPaymentService pointsPaymentService = new PointsPaymentService();
private ShippingService shippingService = new ShippingService();
public void giftExchange(PointsGift pointsGift) {
if (qualifyService.isAvailable(pointsGift)) {
/** 资格检验通过 */
if (pointsPaymentService.pay(pointsGift)) {
//如果积分支付成功,那么就是可以返回订单号了
String shippingOrderNo = shippingService.shipGift(pointsGift);
System.out.println("物流订单系统下单成功,订单号是:"+shippingOrderNo);
}
}
}
}
测试类:
public class Test {
public static void main(String[]args){
PointsGift pointsGift = new PointsGift("T恤");
GiftExchangeService giftExchangeService = new GiftExchangeService();
giftExchangeService.giftExchange(pointsGift);
}
}
这个时候的类图就这样的:
我们还可以用抽象外观类来实现;