当前位置:网站首页>观察者模式
观察者模式
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] 耦合的
参考
边栏推荐
- 无代码7月热讯 | 微软首推数字联络中心平台;全球黑客马拉松...
- C# WPF设备监控软件(经典)-下篇
- Spinnaker调用Jenkins API 返回403错误
- 机器学习——库
- boot issue
- DataBinding下的RecycleView适配器Adapter基类
- 全面讲解 Handler机制原理解析 (小白必看)
- BGP实验(含MPLS)
- outputBufferIndex = mDecode.dequeueOutputBuffer(bufferInfo, 0) 一直返回为-1
- LeetCode third topic (the Longest Substring Without Repeating Characters) trilogy # 3: two optimization
猜你喜欢
Node.js的基本使用(三)数据库与身份认证
Demand analysis of MES management system in electronic assembly industry
Web3 security risks daunting?How should we respond?
typescript56-泛型接口
七夕佳节即将来到,VR全景云游为你神助攻
分布式事务框架 seata
How to find the cause of Fiori Launchpad routing errors by single-step debugging
fsdbDump用法
BioVendor人Clara细胞蛋白(CC16)Elisa试剂盒检测步骤
c语言分层理解(c语言指针(上))
随机推荐
2023年第六届亚太应用数学与统计学国际会议(AMS 2023)
dynamic memory two
【虚拟户生态平台】虚拟化平台安装时遇到的坑
"Miscellaneous" barcode by Excel as a string
Jmeter cross-platform operation CSV files
2022年8月份DAMA-CDGA/CDGP数据治理认证招生简章
BioVendor人Clara细胞蛋白(CC16)Elisa试剂盒检测步骤
无代码7月热讯 | 微软首推数字联络中心平台;全球黑客马拉松...
动态内存二
面试必问的HashCode技术内幕
What warehouse management problems can WMS warehouse management system solve in the electronics industry?
typescript57 - Array generic interface
【链路聚合原理及配置】
新一代服务网关Gateway的实践笔记
Tanabata festival coming, VR panoramic look god assists for you
MATLAB三维绘图命令plot3入门
typescript56 - generic interface
WMS仓储管理系统能解决电子行业哪些仓库管理问题
boot issue
研究生新生培训第四周:MobileNetV1, V2, V3