当前位置:网站首页>观察者模式
观察者模式
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] 耦合的
参考
边栏推荐
- 分子个数 数论(欧拉函数 前缀和
- 手撕Gateway源码,今日撕工作流程、负载均衡源码
- The 600MHz band is here, will it be the new golden band?
- boot issue
- 易动纷享--测试实习生视频面试
- Shell编程之循环语句(for、while)
- typescript57 - Array generic interface
- typescript51-泛型的基本使用
- 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
- Install third-party packages via whl
猜你喜欢

typescript56-泛型接口

字符串的排列

114. How to find the cause of Fiori Launchpad routing error by single-step debugging

Nanoprobes Alexa Fluor 488 FluoroNanogold 偶联物

typescript55 - generic constraints

It will invest about 200 billion US dollars in the United States in 20 years, and Samsung Electronics looks so handsome

js中常用的几种遍历处理数据的方法梳理

typescript57 - Array generic interface

快速入门EasyX图形编程

typescript58 - generic classes
随机推荐
扩展卡尔曼滤波EKF
Install third-party packages via whl
分析:Nomad Bridge黑客攻击的独特之处
2023年航空航天、机械与机电工程国际会议(CAMME 2023)
typescript56 - generic interface
XSS-绕过for循环过滤
Web3 安全风险令人生畏?应该如何应对?
面试必问的HashCode技术内幕
typescript58-泛型类
XSS - Bypass for loop filtering
After building the pytorch environment, the pip and conda commands cannot be used
越来越火的图数据库到底能做什么?
GeoAO:一种快速的环境光遮蔽方案
JVM垃圾回收总结(未完待续)
typescript58 - generic classes
nodeJs--async/await
Justin Sun: Web3.0 and the Metaverse will assist mankind to enter the online world more comprehensively
js中常用的几种遍历处理数据的方法梳理
VR全景拍摄线上展馆,3D全景带你沉浸体验
.NET静态代码织入——肉夹馍(Rougamo) 发布1.1.0