观察者模式
观察者模式
相信大家在日常生活中一定会遇到这样的场景:逛某宝的时候,商品没货了,或者价格太高了。会有一个到货通知、降价通知的模式。这就是“观察者模式”,其中商品就是被观察者,用户就是观察者。它是一种通知机制,在“被观察者”产生变动时,“观察者”可以感知到变动并做出相应的操作。
观察者模式也称为“发布-订阅模式”(Publish-Subscribe:Pub/Sub)。在观察者模式中有两类称呼进行对应。
- 观察者-被观察者(Observer-Subject)
- 发布-订阅(Publish-Subscribe)
在本文中以便混乱我们规定一下叫法,我们选择“观察者-被观察者(Observer-Subject)”这个称呼。
针对上文提到的场景。
首先我们先定义被观察者接口:
public interface ISubject { // 观察者列表 List<IObserver> observerList = new ArrayList<>(); default void addObserver(IObserver observer) { observerList.add(observer); } default void removeObserver(IObserver observer) { observerList.remove(observer); } default void notifyObserver(String message) { for (IObserver observer : observerList) { observer.update(message); } } }
定义具体的被观察者---商品:
public class CommoditySubject implements ISubject { // 商品上架之后通知观察者 public void online() { notifyObserver("商品上架了,快速购买吧"); } // 商品上架之后通知观察者 public void reduce() { notifyObserver("商家降价,快速购买吧"); } }
定义抽象的观察者:
public interface IObserver { // 收到通知,之后的处理逻辑 void update(String message); }
定义具体的观察者---用户:
public class UserObserver implements IObserver { private String userName; public UserObserver(String userName) { this.userName = userName; } @Override public void update(String message) { System.out.println(String.format("%s 被通知: %s", this.userName, message)); } }
代码定义之后,我们通过Client执行:
public class Client { public static void main(String[] args) { CommoditySubject commoditySubject = new CommoditySubject(); // 添加观察者 commoditySubject.addObserver(new UserObserver("张三")); // 添加观察者 commoditySubject.addObserver(new UserObserver("李四")); // 添加观察者 commoditySubject.addObserver(new UserObserver("王宇")); // 商品上架 commoditySubject.online(); // 商品降价 commoditySubject.reduce(); } } /***输出内容如下*******/ 张三 被通知: 商品上架了,快速购买吧 李四 被通知: 商品上架了,快速购买吧 王宇 被通知: 商品上架了,快速购买吧 张三 被通知: 商家降价,快速购买吧 李四 被通知: 商家降价,快速购买吧 王宇 被通知: 商家降价,快速购买吧
通过代码,我们可以看出来,当“被观察者”变动之后,“观察者”就可以收到变动消息,从而做出相应的处理逻辑。并且对于扩展非常方便,如果此时我们新增其他类型的观察者,只需实现 IObserver
即可。
对于有兴趣的同学,可以添加其他类型的观察者,如SystemObserver。