当前位置:网站首页>观察者模式
观察者模式
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] 耦合的
参考
边栏推荐
- 互斥锁、读写锁、自旋锁,以及原子操作指令xaddl、cmpxchg的使用场景剖析
- C语言 函数递归
- [Miscellaneous] How to install the specified font into the computer and then use the font in the Office software?
- 动态内存二
- 【链路聚合原理及配置】
- The Beijing E-sports Metaverse Forum was successfully held
- 因为一次bug的教训,我决定手撕Nacos源码(先撕客户端源码)
- C 学生管理系统_分析
- typescript51 - basic use of generics
- 114. 如何通过单步调试的方式找到引起 Fiori Launchpad 路由错误的原因
猜你喜欢

网络带宽监控,带宽监控工具哪个好

typescript57-数组泛型接口

Tanabata festival coming, VR panoramic look god assists for you

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

咱们500万条数据测试一下,如何合理使用索引加速?

【详细教程】一文参透MongoDB聚合查询

dynamic memory two

动态内存二
![[Miscellaneous] How to install the specified font into the computer and then use the font in the Office software?](/img/15/23b0724f9c9672c61b91320f1b84d8.png)
[Miscellaneous] How to install the specified font into the computer and then use the font in the Office software?

越来越火的图数据库到底能做什么?
随机推荐
XSS - Bypass for loop filtering
nodeJs--async/await
快速入门EasyX图形编程
GeoAO:一种快速的环境光遮蔽方案
vxe-table 从页面批量删除数据 (不动数据库里的数据)
C 学生管理系统_添加学生
Mvc, Mvp and Mvvm
typescript54 - generic constraints
越来越火的图数据库到底能做什么?
js中常用的几种遍历处理数据的方法梳理
typescript53 - generic constraints
数据库扩容也可以如此丝滑,MySQL千亿级数据生产环境扩容实战
js函数防抖和函数节流及其使用场景
Sqlnet. Ora file with the connection of authentication test
typescript53-泛型约束
C# WPF设备监控软件(经典)-下篇
600MHz频段来了,它会是新的黄金频段吗?
无代码7月热讯 | 微软首推数字联络中心平台;全球黑客马拉松...
Using matlab to solve the linear optimization problem based on matlab dynamic model of learning notes _11 】 【
jmeter分布式压测