当前位置:网站首页>观察者模式
观察者模式
2022-08-04 00:53:00 【橙子19911016】
1. 观察者模式
观察者模式:一个或几个对象监听着另一个对象,只要被监听对象的状态发生改变,监听者要随之做出相应的反应。
concrete [ˈkɑːnkriːt] 具体的;实在的
以下是相关代码:
abstract class Subject {
private ArrayList<Observer> observers;
public Subject() {
observers = new ArrayList<>();
}
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void notifyObserver(int state) {
for (Observer o : observers) {
o.update(state);
}
}
}
class ConcreteSubject extends Subject {
private int subjectState;
public int getState() {
return subjectState;
}
public void setState(int newState) {
subjectState = newState;
System.out.println("subject's state change to " + newState);
this.notifyObserver(subjectState);
}
}
interface Observer {
void update(int state);
}
class ConcreteObserver1 implements Observer {
@Override
public void update(int state) {
System.out.println("ConcreteObserver1 knows state had changed to " + state);
doSomething();
}
private void doSomething() {
System.out.println("ConcreteObserver1 do something!");
}
}
class ConcreteObserver2 implements Observer {
@Override
public void update(int state) {
System.out.println("ConcreteObserver2 knows state had changed to " + state);
doSomething();
}
private void doSomething() {
System.out.println("ConcreteObserver2 do something!");
}
}
class ConcreteObserver3 implements Observer {
@Override
public void update(int state) {
System.out.println("ConcreteObserver3 knows state had changed to " + state);
doSomething();
}
private void doSomething() {
System.out.println("ConcreteObserver3 do something!");
}
}
class Test {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
Observer o1 = new ConcreteObserver1();
Observer o2 = new ConcreteObserver2();
Observer o3 = new ConcreteObserver3();
subject.addObserver(o1);
subject.addObserver(o2);
subject.addObserver(o3);
subject.setState(2);
subject.removeObserver(o2);
subject.setState(5);
}
}
// subject's state change to 2
// ConcreteObserver1 knows state had changed to 2
// ConcreteObserver1 do something!
// ConcreteObserver2 knows state had changed to 2
// ConcreteObserver2 do something!
// ConcreteObserver3 knows state had changed to 2
// ConcreteObserver3 do something!
// subject's state change to 5
// ConcreteObserver1 knows state had changed to 5
// ConcreteObserver1 do something!
// ConcreteObserver3 knows state had changed to 5
// ConcreteObserver3 do something!
2 发布订阅模式
有很多人认为发布订阅模式就是观察者模式,Publisher == Subject 被观察者,Subscriber == Observer 观察者 ,其实不然。在发布订阅模式中,被观察并不会直接通知订阅者,换句话说,发布者和订阅者并不相干。如果互不相干,它们之间是如何进行交流的?通过第三者——事件总线或者叫做经纪人(Broker)。
broker [ˈbroʊkər] 经纪人,中间人
如果说观察者模式实现了松耦合(loosely coupled),发布订阅模式就是完全解耦的。
loosely [ˈluːsli] 宽松地 coupled [ˈkʌpld] 耦合的
参考
边栏推荐
- LeetCode third topic (the Longest Substring Without Repeating Characters) trilogy # 3: two optimization
- 快速入门EasyX图形编程
- typescript52-简化泛型函数调用
- What warehouse management problems can WMS warehouse management system solve in the electronics industry?
- C 学生管理系统 显示链表信息、删除链表
- 2022-08-03: What does the following go code output?A: 2; B: 3; C: 1; D: 0.package main import "fmt" func main() { slice := []i
- After building the pytorch environment, the pip and conda commands cannot be used
- "Miscellaneous" barcode by Excel as a string
- TypeScript学习
- 字符串变形
猜你喜欢
随机推荐
JVM垃圾回收总结(未完待续)
typescript55-泛型约束
LeetCode third topic (the Longest Substring Without Repeating Characters) trilogy # 3: two optimization
易动纷享--测试实习生视频面试
win10+cuda11.7+pytorch1.12.0 installation
网络带宽监控,带宽监控工具哪个好
Install third-party packages via whl
ENS域名注册量创历史新高 逆市增长之势?光环之下存在炒作风险
.NET Static Code Weaving - Rougamo Release 1.1.0
typescript53-泛型约束
js函数防抖和函数节流及其使用场景
The problem of disorganized data output by mnn model
It will invest about 200 billion US dollars in the United States in 20 years, and Samsung Electronics looks so handsome
js中常用的几种遍历处理数据的方法梳理
View the version number of CUDA, pytorch, etc.
谁说程序员不懂浪漫,表白代码来啦~
C# wpf使用ffmpeg命令行实现录屏
Read FastDFS in one article
电子组装行业对MES管理系统的需求分析
jmeter distributed stress test








