观察者模式
观察者模式
相信大家在日常生活中一定会遇到这样的场景:逛某宝的时候,商品没货了,或者价格太高了。会有一个到货通知、降价通知的模式。这就是“观察者模式”,其中商品就是被观察者,用户就是观察者。它是一种通知机制,在“被观察者”产生变动时,“观察者”可以感知到变动并做出相应的操作。
观察者模式也称为“发布-订阅模式”(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。
