观察者模式
模式 观察者
2023-09-14 08:58:22 时间
观察者模式原理
当一个对象改变了自身的状态后,它会通知其他对象告知发生了变化。
用设计模式的语言来说,改变自身状态的对象叫做主题(Subject),接受改变通知的那些对象叫做观察者。其关系是一对多的,一个主题可以有多个观察者。
观察者类图
观察者模式引入了一个Observer接口,所有具体的观察者都需要实现该接口。该接口只有一个方法,主题会调用该方法,通知观察者自己的状态发生了变化。每个主题都持有一个已注册的观察者列表,并且会调用一个方法(notifyObservers)来通知注册的观察者关于主题的更新或是变化。主题提供了注册和取消注册观察者的方法。
使用普通方法实现观察者模式
Java对观察者模式提供了开箱即用的实现。通过实现Observer接口,以及继承Observable类,可以轻松实现观察者模式。
用观察者模式做一个新闻订阅的功能,当新闻发生改变的时候,通知所有订阅者有新的新闻。
定义主题:
1 import java.util.ArrayList; 2 import java.util.List; 3 import java.util.Observable; 4 import java.util.Observer; 5 6 /** 7 * @author jiashubing 8 * @since 2017/7/17 9 */ 10 public class NewsAgency extends Observable implements Publisher { 11 private List<Observer> channels = new ArrayList<>(); 12 13 public void addNews(String newsItem){ 14 notifyObservers(newsItem); 15 } 16 17 public void notifyObservers(String newsItem){ 18 for(Observer outlet : this.channels){ 19 outlet.update(this, newsItem); 20 } 21 } 22 23 public void register(Observer outlet){ 24 channels.add(outlet); 25 } 26 }
Publisher接口:
public interface Publisher { }
具体的观察者:
1 import java.util.Observable; 2 import java.util.Observer; 3 4 /** 5 * @author jiashubing 6 * @since 2017/7/17 7 */ 8 public class RadioChannel implements Observer { 9 10 @Override 11 public void update(Observable agency, Object newsItem){ 12 if(agency instanceof Publisher){ 13 System.out.println((String)newsItem); 14 } 15 } 16 }
测试:
1 public class Test { 2 public static void main(String[] args){ 3 //创建主题 4 NewsAgency newsAgency = new NewsAgency(); 5 6 //创建观察者 7 RadioChannel radioChannel1 = new RadioChannel(); 8 RadioChannel radioChannel2 = new RadioChannel(); 9 10 //主题注册观察者 11 newsAgency.register(radioChannel1); 12 newsAgency.register(radioChannel2); 13 14 newsAgency.addNews("第一条新闻"); 15 newsAgency.addNews("第二条新闻"); 16 newsAgency.addNews("第三条新闻"); 17 } 18 }
输出结果为:
第一条新闻
第一条新闻
第二条新闻
第二条新闻
第三条新闻
第三条新闻
其中Observer 接口的内容是:
public interface Observer { void update(Observable o, Object arg); }
Observable类的代码就比较多了。
参考《Professional Java EE Design Patterns》
原创文章,欢迎转载,转载请注明出处!
相关文章
- 从vue源码中学习观察者模式
- 【设计模式 10】观察者模式
- SpringCloudRPC调用核心原理:RxJava响应式编程框架,观察者模式
- 漫谈模式之建造者模式(由来和通用写法)
- 单例模式-双重检查锁(DCL)和volatile 的应用
- Java设计模式之迭代器模式
- 产学协同,模式创新 | “教育部-腾讯产学合作协同育人”优秀案例深度分享
- javascript设计模式-观察者模式
- 责任链模式
- CentOS命令行下装oracle 12c的方法(命令行模式安装)
- java设计模式之观察者模式详解架构师
- java设计模式之装饰器模式详解架构师
- Java学习笔记之三十详解Java单例(Singleton)模式编程语言
- 观察者模式详解编程语言
- [PHP] 看博客学习观察者模式详解编程语言
- DaoCloud开创Docker容器云平台的新模式
- Oracle数据库:只读模式下的操作技巧(oracle数据库只读)
- MySQL数据库模式优化实践(mysql 数据库模式)
- 使用Oracle专用连接模式实现安全数据交换(oracle专用连接模式)
- Android源码学习之观察者模式应用及优点介绍
- PHP设计模式之观察者模式(Observer)详细介绍和代码实例
- Python设计模式之观察者模式实例
- 构造函数+原型模式构造js自定义对象(最通用)