Java设计模式_(行为型)_观察者模式
来源:互联网 发布:python 周期性任务 编辑:程序博客网 时间:2024/05/21 17:56
引用百科
观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
相关角色
观察者模式主要包括以下角色:
1、抽象主题(Subject)角色:抽象主题角色把所有对观察者对象的引用保存在一个聚集(比如ArrayList对象)里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,抽象主题角色又叫做抽象被观察者(Observable)角色。
2、具体主题(RealSubject)角色:将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者(Concrete Observable)角色。
3、抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口。
具体观察者(RealObserver)角色:存储与主题的状态自恰的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态 像协调。如果需要,具体观察者角色可以保持一个指向具体主题对象的引用。
具体实现
具体代码
1、抽象主题类
//抽象主题类public abstract class Subject {// 观察者集合private List<Observer> list = new ArrayList<Observer>();// 添加观察者public void register(Observer observer) {list.add(observer);}//删除public void remove(Observer observer) {if (list.contains(observer)) {list.remove(observer);}}public void change(String status) {this.notifyObserver(status);}//通知所有观察者private void notifyObserver(String status) {for (Observer observer : list) {observer.update(status);}}}
2、主题具体实现类
//具体主题角色类public class RealSubject extends Subject {private String status;public String getStatus() {return status;}public void setStatus(String status) {this.status = status;}public void change(String status) {System.out.println("当前主题状态:" + status);super.change(status);}}
//观察者接口public interface Observer {public void update(String status);}
//具体观察者类public class RealObserver implements Observer {private String name;private String innerStatus;public RealObserver(String name) {super();this.name = name;}@Overridepublic void update(String status) {this.innerStatus = status;System.out.println("观察者" + name + ",状态:" + innerStatus);}public String getName() {return name;}public void setName(String name) {this.name = name;}}
5、客户端Client测试
public class Client {public static void main(String[] args) {// 创建主题RealSubject subject = new RealSubject();// 创建观察者Observer observerA = new RealObserver("张三");Observer observerB = new RealObserver("李四");// 给主题添加观察者subject.register(observerA);subject.register(observerB);// 改变主题内容状态subject.change("start");}}
以上通过简单的代码实现了观察者模式,运行输出:
当前主题状态:start
观察者张三,状态:start
观察者李四,状态:start
在运行时,这个客户端首先创建了具体主题类的实例,以及一个观察者对象。然后,它调用主题对象的register()方法,将这个观察者对象向主题对象登记,也就是将它加入到主题对象的聚集中去。这时,客户端调用主题的change()方法,改变了主题对象的内部状态。主题对象在状态发生变化时,调用超类的notifyObservers()方法,通知所有登记过的观察者对象。
- Java设计模式_(行为型)_观察者模式
- Java设计模式_行为模式_观察者模式
- Java设计模式_行为型_观察者模式_任意行为的监听
- Java设计模式_(行为型)_责任链模式
- Java设计模式_(行为型)_命令模式
- Java设计模式_(行为型)_迭代模式
- Java设计模式_(行为型)_中介者模式
- Java设计模式_(行为型)_备忘录模式
- Java设计模式_(行为型)_状态模式
- Java设计模式_(行为型)_策略模式
- Java设计模式_(行为型)_模版方法模式
- Java设计模式_(行为型)_访问者模式
- Java设计模式_(行为型)_解析器模式
- 23种设计模式(16)_行为型_观察者模式(Observer Pattern)
- java设计模式_观察者模式
- java设计模式_观察者模式
- java设计模式20_观察者模式
- Java 设计模式_观察者模式
- 进程和线程,vmstat,iostat,dstat,
- GTK显示GIF、GTK动画(图片连续播放)
- emoji表情存入数据库
- [FJOI2007]轮状病毒
- 9.08 笔记-抽象类与接口与多态
- Java设计模式_(行为型)_观察者模式
- 【codevs 2451】互不侵犯
- bitset+暴力——校门外的树(增强版)
- shell
- python里面random的使用
- 3.4 线程id获取
- LeetCode 96. Unique Binary Search Trees Python Solution, Catalan数 结点数为n的不同形态的二叉树一共有多少种
- 沪江日语百度云视频 0-n1百度云网盘视频的swf需要特定的播放器才能播放
- [POJ 3321]Apple Tree dfs序+树状数组