观察者模式:又称发布-订阅模式,多个观察者同时监听同一个主题对象,当主题对象的状态发生变化时,观察者监听到这个变化,然后做出相应的行为。
涉及到的角色主要是两个:主题和观察者。
为了扩展我们可以给主题和观察者都先定义一个抽象角色。
用一个司空见惯的例子实现一下:电商网站,假设把下单看做是一个主题角色,其他角色(库存、物流、积分)作为观察者,当观察着监听到下单这个动作时,就会触发自己的操作。
抽象观察者:
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中的事件的发布与监听。实际中电商这个场景肯定不会用这么简单的实现,这里只是为了说明这个例子。实际开发中这个模式应该会经常用到,只不过可能我们不太留意。