【设计模式】观察者模式

xiaoxiao2021-02-27  355

1.介绍 观察者模式定义了一种一对多的关系,一个被观察者可以被多个观察者监听,并且 可以拥有添加或删除观察者的功能。当被观察者的状态发生改变时,将会通知所有 监听它的观察者。 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

转载请注明原文地址: https://www.6miu.com/read-1122.html

最新回复(0)