1.概述
观察者设计模式,也称发布订阅模式;
被观察者(发布者)发布信息,观察者(订阅者)订阅后就会收到消息
该模式涉及四个角色:
抽象被观察角色
具体被观察角色
抽象观察角色
具体观察角色
示例:
package StudyJava;
public interface Observerable {
// 发布者需要实现几个功能:订阅者注册,订阅者移除,订阅者唤醒
public void registerOberver(Observer observer);
public void removeOberver(Observer observer);
public void notifyOberver();
}
interface Observer{
// 订阅者需要有更新自己的方法,供发布者去发布
public void update(String message);
}
package StudyJava;
import java.util.ArrayList;
import java.util.List;
public class WeChatServer implements Observerable {
// 一个发布者的实现
// 订阅者列表,当发布者发布时,会通知所有订阅者
private List<Observer> observerList;
private String message;
// 在构造器初始化List
public WeChatServer(){
observerList = new ArrayList<Observer>();
}
@Override
public void registerOberver(Observer observer) {
observerList.add(observer);
}
@Override
public void removeOberver(Observer observer) {
// 这里判断observer是否在列表中
if(observerList.contains(observer)){
observerList.remove(observer);
}
}
@Override
public void notifyOberver() {
for(Observer observer : observerList){
observer.update(message);
}
}
// 提供一个修改信息的方法,在内部调用notify
public void changeMessage(String message){
this.message = message;
// 这里会先对message赋值,因而notify会将最新信息发布
notifyOberver();
}
}
package StudyJava;
public class UserObserver implements Observer{
private String message;
@Override
public void update(String message) {
this.message = message;
read();
}
public void read(){
// 打印信息和是哪个对象收到的信息
System.out.println(message + this.toString());
}
}
测试:
package StudyJava;
public class test4 {
public static void main(String[] args) {
UserObserver user1 = new UserObserver();
UserObserver user2 = new UserObserver();
WeChatServer ws = new WeChatServer();
ws.registerOberver(user1);
ws.registerOberver(user2);
ws.changeMessage("今天吃顿好的");
}
}