使用观察者模式来设计支付完毕的后续操作

现在我们已经有了一个交易模块,而当交易完成之后,肯定会发生很多业务操作,如何来给这很多的业务操作解耦呢?这里我们使用观察者模式来完成以下三个业务:

当用户支付成功时,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内部进行变动。

 

posted @ 2018-06-18 19:23  coding88  阅读(379)  评论(0编辑  收藏  举报