- 观察者模式是用来干嘛的?
- 观察者模式有那些角色?
- 观察者模式是怎样实现的?
观察者模式是用来干嘛的?
如果你知道消息队列那你可以跳过这一段了。
我们都知道公众号,用户只要关注了公众号就可以收到公众号发来的通知。那观察者这个设计模式就是用来干这个的
观察者模式有那些角色?
先甩图
看不懂没关系,你可以跟着我敲一遍,敲完实例你就可以理解这张图了
Subject(被观察者接口也可以叫做订阅)
有时也叫Observable,其是一个接口,定义了观察者如何订阅与取消订阅的方法(添加观察者与移除观察者),以及当状态发生变化时的通知方法
ConcreteSunject(被观察者接口的实现)
实现Subject,持有Observer的集合
Observer(观察者的抽象)
定义了如何接收事件通知的方法。
ConcreteObserver(观察者实现类)
观察者模式是怎样实现的?
PublicObject 充当公众号的角色
User1 充当用户1的角色
User2 充当用户2的角色
被观察者抽象类
import java.util.ArrayList;
import java.util.List;
// 主题抽象类
public abstract class Subject {
// list用来存储观察者
List<Observer> observers =new ArrayList<>();
// 添加观察者
void addObServer(Observer obServer){
observers.add(obServer);
}
// 移除观察者
void removeObServer(Observer obServer){
observers.remove(obServer);
}
// 通知所有观察者
public abstract void notifyAllObServer();
}
观察者接口类
// 观察者接口
public interface Observer {
// 接收事件通知的方法
void notifyToDo();
}
公众号类继承被观察者抽象(被观察对象)
// 公众号
public class PublicObject extends Subject {
@Override
public void notifyAllObServer() {
// 通知所有观察者
for (Observer obServer : observers) {
obServer.notifyToDo();
}
System.out.println("通知发送完毕");
}
}
用户类1实现观察者接口(观察者对象)
public class User1 implements Observer {
@Override
public void notifyToDo() {
System.out.println("用户1开始执行通知");
}
}
用户类2实现观察者接口(观察者对象)
public class User2 implements Observer {
@Override
public void notifyToDo() {
System.out.println("用户2开始执行通知");
}
}
然后我们用一个启动类来实现一下观察者模式
// 启动类
public class Start {
public static void main(String[] args) {
User1 user1 = new User1();
User2 user2 = new User2();
PublicObject publicObject = new PublicObject();
// 添加观察者user1
publicObject.addObServer(user1);
// 添加观察者user2
publicObject.addObServer(user2);
// 发出通知
publicObject.notifyAllObServer();
}
}
观察者模式实现完毕!代码很简单,但是这个设计模式不简单!