使用观察者模式来设计支付完毕的后续操作
现在我们已经有了一个交易模块,而当交易完成之后,肯定会发生很多业务操作,如何来给这很多的业务操作解耦呢?这里我们使用观察者模式来完成以下三个业务:
当用户支付成功时,1、给用户添加积分;2。给用户一条通知短信;3。如果金额大于100元时,就赠送一张抵消5元的优惠券
类的关系如下图所示:
大体思路就是,设计两个IObserver接口和IObserverable接口,让具体的短信、积分、优惠券业务实现观察者(IObserver)接口,这样PayService实现观察者管理接口后,就可以用PayService来根据具体业务管理这三个功能,大体的代码实现如下所示。
设计IObserverable和IObserver接口:
public interface IObserver { public void update(OrderEntity orderEntity); } public interface IObServerable { public void registerObserver(IObserver ob); public void removeObserver(IObserver ob); public void notifyObserver(); }
编写短信、积分、优惠券业务的实现类:
public class SmsService implements IObserver { @Override public void update(OrderEntity orderEntity) { System.out.println("短信通知:进行了一笔"+orderEntity.getPrice()+"元的消费"); } }
public class ScoreService implements IObserver { @Override public void update(OrderEntity orderEntity) { System.out.println("您消费了"+orderEntity.getPrice()+"元,所以累积了"+orderEntity.getPrice()+"个积分"); } }
public class CouponService implements IObserver { @Override public void update(OrderEntity orderEntity) { System.out.println("消费满100元可以赠送您价值10元的优惠券一张"); } }
改造PayService类来实现管理被观察的对象:
public class PayService implements IPay { public PayService() { initObserverList(); } private void initObserverList(){ list = new ArrayList<>(); } @Override public boolean backPay(OrderEntity orderEntity) { return false; } private OrderEntity orderEntity; @Override public boolean pay(OrderEntity orderEntity) { System.out.println("支付了"+orderEntity.getPrice()+"元"); this.orderEntity = orderEntity; notifyObserver(); return false; } private List<IObserver> list; public void registerObserver(IObserver ob) { list.add(ob); } public void removeObserver(IObserver ob) { if(null != list){ list.remove(ob); } } public void notifyObserver() { list.forEach((IObserver observer) ->{ observer.update(orderEntity); }); } }
编写测试方法:
public static void main(String[] args) { IObserver scoreService = new ScoreService(); IObserver couponService = new CouponService(); IObserver smsService = new SmsService(); OrderEntity orderEntity = new OrderEntity(); orderEntity.setPrice(95d); IPay payService = new PayService(); payService.registerObserver(scoreService); payService.registerObserver(smsService); payService.registerObserver(couponService); if(orderEntity.getPrice() < 100){ payService.removeObserver(couponService); } payService.pay(orderEntity); }
执行可以得到以下结果:
可以看到,具体逻辑判断没有影响到业务实现类,而是在业务外部完成的,如果后续有新增的业务,比如说支付成功后,需要把金额入账到另一个业务对象中,只需要编写新的观察者类,然后交给payService来注册即可,不需要再去对payService内部进行变动。