当前位置:网站首页>观察者模式
观察者模式
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] 耦合的
参考
边栏推荐
- 咱们500万条数据测试一下,如何合理使用索引加速?
- 手撕Nacos源码,今日撕服务端源码
- typescript57 - Array generic interface
- 如何通过单步调试的方式找到引起 Fiori Launchpad 路由错误的原因试读版
- LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之三:两次优化
- 求解同余方程 数论 扩展欧几里得
- Analysis: What makes the Nomad Bridge hack unique
- C语言 函数递归
- 【面经】被虐了之后,我翻烂了equals源码,总结如下
- 带你造轮子,自定义一个随意拖拽可吸边的悬浮View组件
猜你喜欢

Install third-party packages via whl

LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之三:两次优化

Shell编程之循环语句(for、while)

How to find the cause of Fiori Launchpad routing errors by single-step debugging

typescript52-简化泛型函数调用

分布式事务框架 seata

C# wpf使用ffmpeg命令行实现录屏

Salesforce's China business may see new changes, rumors may be closing

即席查询——Presto

ENS域名注册量创历史新高 逆市增长之势?光环之下存在炒作风险
随机推荐
c语言分层理解(c语言指针(上))
2023年第六届亚太应用数学与统计学国际会议(AMS 2023)
字符串变形
身为程序员的我们如何卷死别人?破局重生。
手撕Gateway源码,今日撕工作流程、负载均衡源码
The Beijing E-sports Metaverse Forum was successfully held
高斯推断推导
无代码7月热讯 | 微软首推数字联络中心平台;全球黑客马拉松...
typescript56-泛型接口
Nanoprobes Alexa Fluor 488 FluoroNanogold 偶联物
The 600MHz band is here, will it be the new golden band?
电子制造企业部署WMS仓储管理系统的好处是什么
新一代服务网关Gateway的实践笔记
Using matlab to solve the linear optimization problem based on matlab dynamic model of learning notes _11 】 【
114. How to find the cause of Fiori Launchpad routing error by single-step debugging
XSS - Bypass for loop filtering
XSS-绕过for循环过滤
pcl点云数据 转化为 Eigen::Map
Modulo operation (MOD)
boot issue