package com.yuan;
import java.util.ArrayList;
import java.util.List;
/**
* @author QLBF 观察者模式演示
* @version 1.0
* @date 2021/6/4 16:47
*/
//1.定义抽象主题接口,提供了attach、detach、notify三个方法
interface Subject{
//增加订阅者(观察者)就是WeixinUser
public void attach(Observer observer);
//删除订阅者
public void detach(Observer observer);
//通知订阅者更新消息
public void notify(String message);
}
//2.(重点)微信公众号是具体主题(具体被观察者),里面存储了订阅该公众号的微信用户,并实现了抽象主题中的方法
class SubscriptionSubject implements Subject{
//储存订阅公众号的微信用户
private List<Observer> weixinUserList=new ArrayList<>();
@Override
public void attach(Observer observer) {
weixinUserList.add(observer);
}
@Override
public void detach(Observer observer) {
weixinUserList.remove(observer);
}
//不好就在这里,如果用户多,遍历通知很耗时
@Override
public void notify(String message) {
for (Observer observer : weixinUserList) {
observer.update(message);
}
}
}
//3.定义抽象观察者接口,里面定义一个更新的方法
interface Observer{
void update(String message);
}
//4.定义具体观察者类,微信用户是观察者,里面实现了更新的方法
class WeixinUser implements Observer{
// 微信用户名
private String name;
public WeixinUser(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name+"-"+message);
}
}
//测试
public class Client {
public static void main(String[] args) {
SubscriptionSubject subscriptionSubject=new SubscriptionSubject();
//创建微信用户
WeixinUser user1=new WeixinUser("小何");
WeixinUser user2=new WeixinUser("小回");
WeixinUser user3=new WeixinUser("小李");
//订阅公众号
subscriptionSubject.attach(user1);
subscriptionSubject.attach(user2);
subscriptionSubject.attach(user3);
//公众号更新发出消息给订阅的微信用户
subscriptionSubject.notify("快乐大本营更新了!");
}
}
微信公众号通知一次,所有的用户都收到了,秒!
本文来源:黑马设计模式笔记