设计模式-观察者模式

观察者模式:又称发布-订阅模式,多个观察者同时监听同一个主题对象,当主题对象的状态发生变化时,观察者监听到这个变化,然后做出相应的行为。

涉及到的角色主要是两个:主题和观察者。

为了扩展我们可以给主题和观察者都先定义一个抽象角色。

用一个司空见惯的例子实现一下:电商网站,假设把下单看做是一个主题角色,其他角色(库存、物流、积分)作为观察者,当观察着监听到下单这个动作时,就会触发自己的操作。

抽象观察者:

public interface Observe {
    void update(String message);
}

抽象主题:

public interface Subject {

    void addObserve(Observe observe);

    void publish(String message);
}

具体的主题(下单):

public class OrderSubject implements Subject{
    // 多个观察者
    private List<Observe> observeList = new ArrayList<>();

    // 这个方法只是为了添加多个观察者方便
    @Override
    public void addObserve(Observe observe) {
        observeList.add(observe);
    }

    // 发布消息,让各个观察者去执行各自的逻辑
    @Override
    public void publish(String message) {
        for (Observe observe : observeList) {
            observe.update(message);
        }
    }
}

具体观察者:

// 库存系统
public class StoreObserve implements Observe{
    @Override
    public void update(String message) {
        System.out.println("受到订单:"+message+",已经扣减了库存");
    }
}
// 物流系统
public class TranseformObserve implements Observe{
    @Override
    public void update(String message) {
        System.out.println("收到订单:"+message+",准备发货了");
    }
}
// 积分系统
public class ScoreObserve implements Observe{
    @Override
    public void update(String message) {
        System.out.println("用户下单成功,积分已到账");
    }
}

测试:

public class Client {
    public static void main(String[] args) {
        // 主题
        OrderSubject orderSubject = new OrderSubject();
        // 观察者
        orderSubject.addObserve(new StoreObserve());
        orderSubject.addObserve(new TranseformObserve());
        orderSubject.addObserve(new ScoreObserve());

        // 发布消息
        orderSubject.publish("苹果手机1部");
    }
}

小结一下:用过消息中间件的话,我们就会觉得很熟悉,其实这个模式和消息中间件就是相同的思想,还有springboot中的事件的发布与监听。实际中电商这个场景肯定不会用这么简单的实现,这里只是为了说明这个例子。实际开发中这个模式应该会经常用到,只不过可能我们不太留意。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容