标签:read not update 实例 接收 test mic sage com
在观察者模式中,包括以下四个角色:
主题(被观察者)(Subject):主题是一个接口,该接口规定了具体主题需要实现的方法,比如,添加、删除观察者以及通知观察者更新数据的方法。
观察者(Observer):观察者是一个接口,该接口规定了具体观察者用来更新数据的方法。
具体主题(ConcreteSubject):具体主题是实现主题接口类的一个实例,该实例包含有可以经常发生变化的数据。具体主题需使用一个集合,比如ArrayList,存放观察者的引用,以便数据变化时通知具体观察者。
具体观察者(ConcreteObserver):具体观察者是实现观察者接口类的一个实例。具体观察者包含有可以存放具体主题引用的主题接口变量,以便具体观察者让具体主题将自己的引用添加到具体主题的集合中,使自己成为它的观察者,或让这个具体主题将自己从具体主题的集合中删除,使自己不再是它的观察者。
实现案例: 不同的几个用户订阅了某个平台的消息,该平台发布一条消息后,所有的订阅者都可以接收到这条消息
步骤一:定义一个被观察者(主题)接口
/**
* 定义一个被观察者(主题)接口
*/
public interface ObserverSubject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObserver();
}
步骤二:定义一个类实现被观察者(主题)接口
import java.util.ArrayList;
import java.util.List;
/**
* 具体主题类,实现主题接口
*/
public class WecharSubject implements ObserverSubject {
// 这个集合是实现“不知道有多少对象需要进行相应修改”的关键
List<Observer> list = new ArrayList<>();
String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
notifyObserver();
}
@Override
public void registerObserver(Observer o) {
// 将观察者对象添加进集合中
list.add(o);
}
@Override
public void removeObserver(Observer o) {
if (!list.isEmpty())
list.remove(o);
}
/**
* 遍历更新消息
*/
@Override
public void notifyObserver() {
for (Observer ll : list) {
Observer observer = ll;
observer.update(message);
}
}
}
步骤三:定义一个观察者接口,订阅消息的更新功能
/**
* 定义一个观察者接口
*/
public interface Observer {
public void update(String message);
}
步骤四:定义一个类实现观察者接口
/**
* 定义一个具体观察者,也就是订阅者
*/
public class UserObserver implements Observer {
String name;
String message;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void read() {
System.out.println(name + "收到推送的消息:" + message);
}
@Override
public void update(String message) {
this.message = message;
read();
}
}
添加用户进行消息订阅
public class Test {
@org.junit.Test
public void test() {
WecharSubject wecharSubject = new WecharSubject();
UserObserver user = new UserObserver();
user.setName("小明");
UserObserver user1 = new UserObserver();
user1.setName("小红");
// 添加订阅者
wecharSubject.registerObserver(user);
wecharSubject.registerObserver(user1);
// 给订阅者发布消息
wecharSubject.setMessage("快把包子吃了");
}
}
标签:read not update 实例 接收 test mic sage com
原文地址:https://www.cnblogs.com/lyd447113735/p/14838387.html