【设计模式】观察者模式
来源:互联网 发布:电脑软件莫名消失 编辑:程序博客网 时间:2024/06/05 10:38
1.介绍
观察者模式定义了一种一对多的关系,一个被观察者可以被多个观察者监听,并且
可以拥有添加或删除观察者的功能。当被观察者的状态发生改变时,将会通知所有
监听它的观察者。
2.结构
(1)抽象的被观察者
定义一个观察者的接口或抽象类,其中有新增、删除以及通知所有观察者的方法定义。
(2)抽象的观察者
定义观察者接收到监听对象的更新状态之后执行的动作的方法
(3)具体的被观察者
实现新增、删除以及通知所有观察者的方法定义,添加观察者对象的集合作为成员变量。
(4)具体的观察者
实现接收到监听对象的更新状态之后执行的动作的方法
3.实例
我们这里实现一个模拟微博频道订阅的模式的样例,被观察者是某热门微博频道,观察者是订阅该频道的其它用户。
首先我们先创建一个观察者的接口Observer:
接着我们实现具体的观察者,新建MicroBlogUser(微博用户)类,实现Observer接口,实现
update方法,来编写当观察者接收到监听对象的更新状态之后执行的动作的逻辑:
addObserver、removeObserver以及notifyObservers方法,并添加了一个保存所有观察
者的List集合作为其成员变量:
所有订阅者都会收到新闻信息:
观察者模式定义了一种一对多的关系,一个被观察者可以被多个观察者监听,并且
可以拥有添加或删除观察者的功能。当被观察者的状态发生改变时,将会通知所有
监听它的观察者。
2.结构
(1)抽象的被观察者
定义一个观察者的接口或抽象类,其中有新增、删除以及通知所有观察者的方法定义。
(2)抽象的观察者
定义观察者接收到监听对象的更新状态之后执行的动作的方法
(3)具体的被观察者
实现新增、删除以及通知所有观察者的方法定义,添加观察者对象的集合作为成员变量。
(4)具体的观察者
实现接收到监听对象的更新状态之后执行的动作的方法
3.实例
我们这里实现一个模拟微博频道订阅的模式的样例,被观察者是某热门微博频道,观察者是订阅该频道的其它用户。
首先我们先创建一个观察者的接口Observer:
package cn.com.observer.test;public interface Observer { public void Update(String str); }其中定义了监听对象的更新状态之后执行的动作的方法然后创建一个被观察者的接口Observed:package cn.com.observer.test;public interface Observed { public void addObserver(Observer observer); public void removeObserver(Observer observer); public void notifyObservers(String str); }其中有新增、删除以及通知所有观察者的方法定义
接着我们实现具体的观察者,新建MicroBlogUser(微博用户)类,实现Observer接口,实现
update方法,来编写当观察者接收到监听对象的更新状态之后执行的动作的逻辑:
package cn.com.observer.test;public class MicroBlogUser implements Observer { //观察者用户名 private String username; //设置用户名 public void setUsername(String username) { this.username = username; } //接收到监听对象的更新状态之后执行的动作 public void Update(String str) { //打印监听到的信息 System.out.println(this.username+"接收到了以下信息:"+str); }}然后实现具体的被观察者,新建NewsChannel(新闻频道)类,实现Observed接口,实现了
addObserver、removeObserver以及notifyObservers方法,并添加了一个保存所有观察
者的List集合作为其成员变量:
package cn.com.observer.test;import java.util.ArrayList;import java.util.List;public class NewsChannel implements Observed { //所有的观察者集合 private List<Observer> microBlogUsers = new ArrayList<Observer>(); //添加观察者 public void addObserver(Observer observer) { microBlogUsers.add(observer); } //删除观察者 public void removeObserver(Observer observer) { microBlogUsers.remove(observer); } //通知所有观察者 public void notifyObservers(String str) { for(int i=0;i<microBlogUsers.size();i++){ microBlogUsers.get(i).Update(str); } }}最后我们编写测试类,让张三、李四和王五订阅该新闻频道,然后新闻频道已发出新的新闻,
所有订阅者都会收到新闻信息:
package cn.com.observer.test;public class ObserverTest { public static void main(String[] args) { //创建三个观察者并为其命名 MicroBlogUser zhangSan = new MicroBlogUser(); MicroBlogUser liSi = new MicroBlogUser(); MicroBlogUser wangWu = new MicroBlogUser(); zhangSan.setUsername("张三"); liSi.setUsername("李四"); wangWu.setUsername("王五"); //创建一个被观察者 NewsChannel newsChannel = new NewsChannel(); //为其设置观察者 newsChannel.addObserver(zhangSan); newsChannel.addObserver(liSi); newsChannel.addObserver(wangWu); //创建新闻 String news="市人民公园举行活动"; //通知所有观察者 newsChannel.notifyObservers(news); }}运行测试代码,得到结果:
以上就是观察者模式的结构以及实现,比较适用于一些一对多具有传播类型的功能
转载请注明出处:http://blog.csdn.net/acmman/article/details/71158353
1 0
- 模式设计:观察者模式
- 设计模式-----观察者模式
- 设计模式-观察者模式
- 设计模式--观察者模式
- 设计模式:观察者模式
- 设计模式-----观察者模式
- 设计模式:观察者模式
- 设计模式-观察者模式
- 设计模式 观察者模式
- 设计模式-观察者模式
- 设计模式-【观察者模式】
- 设计模式-观察者模式
- 设计模式 -- 观察者模式
- 设计模式-观察者模式
- 【设计模式】观察者模式
- 设计模式- 观察者模式
- 设计模式- 观察者模式
- 设计模式--观察者模式
- 程序开发之——低耦合高内聚
- iOS之渲染到纹理
- 数据结构 第四章 串、数组和广义表
- docker应用输出中文日志乱码,解决过程
- 二叉树的非递归遍历
- 【设计模式】观察者模式
- 算法分析与设计基础(1)汉诺塔问题
- 测试
- 单一职责原则——single responsibility principle, srp
- linux 根据端口 查找对应的进程
- scikit-learn:3.1. Cross-validation: evaluating estimator performance
- 给服务器Poweredge R710装ubuntu
- 我们梳理了国内外逾80家公司,发现6大关键趋势 | 36氪眼健康行业报告
- 通用套接字选项和TCP套接字选项