观察者设计模式包含四个角色:
- 主题(被观察者):一个接口,定义了添加、删除观察者以及通知观察者
- 观察者:一个接口,定义方法接收被观察者推送的信息
- 具体主题:主题的具体实现,需要一个集合存储所有的观察者
- 具体观察者:观察者的实现类
具体案例: 两个用户订阅下单成功主题,下单成功主题给每个订阅者发送一条消息
- 观察者抽象
/**
* 观察者抽象:接收消息
*/
public interface Observer {
void receiveMsg(String msg);
}
- 被观察者抽象
/***
* 被观察者抽象(消息主题:Topic)
*/
public interface MsgTopic {
// 添加订阅者
void addSubscriber(Observer observer);
// 移除订阅者
void removeSubscriber(Observer observer);
// 通知订阅者
void noticeSubscriber();
}
- 具体观察者
/***
* 定义消息的具体订阅者
*/
public class UserObserver implements Observer{
private String name;
public UserObserver(String name) {
this.name = name;
}
public void receiveMsg(String msg) {
System.out.println(this.name + "接收到消息:" + msg);
}
}
- 具体被观察者(下单成功主题)
public class OrderSuccessTopic implements MsgTopic {
List<Observer> list = new ArrayList<Observer>();
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
noticeSubscriber(); // 发送消息
}
public void addSubscriber(Observer observer) {
list.add(observer);
}
public void removeSubscriber(Observer observer) {
if (!list.isEmpty()) {
list.remove(observer);
}
}
public void noticeSubscriber() {
for (Observer observer : list) {
observer.receiveMsg(this.message);
}
}
}
- 测试
public class Test {
public static void main(String[] args) {
UserObserver userA = new UserObserver("张三");
UserObserver userB = new UserObserver("李四");
OrderSuccessTopic orderSuccessTopic = new OrderSuccessTopic();
orderSuccessTopic.addSubscriber(userA);
orderSuccessTopic.addSubscriber(userB);
orderSuccessTopic.setMessage("下单成功");
}
}