设计模式之观察者模式
1. 概括
观察者模式是一种发布订阅机制,当发布者自身状态改变后后,会通知一个或多个订阅者
2. 结构
- 抽象订阅者:订阅者的抽象,至少定义一个update方法,用于接收通知
- 具体抽象者:实现接口并重写方法
- 发布者:定义一个用于存储订阅者的成员属性、几个用于添加或删除订阅者的方法,
无论发生了什么样的事件,发布者都要通知订阅者,(调用订阅者的方法)
3. 使用场景
- 当对象的状态的改变需要影响其它的对象时
- 当一方对象需要观察其它的对象时
4. 实现
- 商店用例:当商店添加物品后,通知订阅者
- 抽象订阅者
public interface Subscriber {
void update(String message);
}
- 具体订阅者
public class User implements Subscriber{
private String name;
public User() {
}
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(this.name + "收到通知:" + message);
}
}
- 发布者
public class Shop {
// 订阅列表
List<Subscriber> subs = new ArrayList<>();
// 添加订阅者
public Shop addSub(Subscriber subscriber) {
subs.add(subscriber);
return this;
}
// 发布
public void addGoods() {
// 通知【第一个】订阅者
for (Subscriber sub : subs) {
sub.update("商品更新");
}
}
}
- 调用
public class Client {
public static void main(String[] args) {
Subscriber user1 = new User("zhangsan"); // 创建订阅者
Subscriber user2 = new User("lisi");
Subscriber user3 = new User("wangwu"); // 没有收到通知,因为没有加到订阅列表中
Shop shop = new Shop(); // 创建发布者
shop.addSub(user1).addSub(user2); // 订阅者添加订阅
shop.addGoods(); // 发布商品,会自动通知订阅者
}
}