观察者模式
来源:互联网 发布:ping优化 编辑:程序博客网 时间:2024/06/09 16:48
观察者模式的定义
定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,
所有依赖它的对象都得到通知并被自动更新。
推模型
目标对象主动向观察者推送目标的详细信息,推送的信息通常是目标对象
的全部或部分数据。
两种模型做个比较
推模型是假定目标对象知道观察者需要的数据
拉模型是目标对象不知道观察者具体需要什么数据,因此把自身传给
观察者,由观察者取值。
拉模型案例,把天气情况通知给观察者。
/** * 目标对象,它知道观察它的观察者,并提供注册(添加)和删除观察者的接口 */public class Subject { //用来保存注册的观察者对象 private List<Observer> observers=new ArrayList<>(); public void attach(Observer observer){ observers.add(observer); } /** * 删除集合中的指定观察者 * @param observer */ public void detach(Observer observer){ observers.remove(observer); } /** * 通知所有注册的观察者对象 */ protected void notifyObservers(){ for(Observer observer:observers){ observer.update(this); } }}
/** * 具体的目标对象,负责把有关状态存入到相应的观察者对象中 */public class ConcreteSubject extends Subject { //目标对象的状态 private String subjectState; public String getSubjectState() { return subjectState; } public void setSubjectState(String subjectState) { this.subjectState = subjectState; this.notifyObservers(); }}
/** * 这是一个观察者接口,定义更新的接口 * 给那些在目标发生变化的时候被通知的对象 */public interface Observer { /** * 更新的接口 * 传入目标对象,方便获取相应的目标对象的状态 * @param subject */ void update(Subject subject);}
/** * 具体的观察者对象,实现更新的方法,使自身的状态和目标的状态保证一直 */public class ConcreteObserver implements Observer { //观察者的状态 private String observerState; private String name; private String event; /** * 获取目标类的状态同步到观察者的状态中 * @param subject */ @Override public void update(Subject subject) { observerState=((ConcreteSubject)subject).getSubjectState(); System.out.println(name+"收到了,"+observerState); System.out.println("他要去"+event); } public String getEvent() { return event; } public void setEvent(String event) { this.event = event; } public String getName() { return name; } public void setName(String name) { this.name = name; }}
public class Test { public static void main(String[] args){ //1创建目标 ConcreteSubject weather=new ConcreteSubject(); //2创建观察者 ConcreteObserver girlfriend=new ConcreteObserver(); girlfriend.setName("女朋友"); girlfriend.setEvent("去约会"); ConcreteObserver mum=new ConcreteObserver(); mum.setName("老妈"); mum.setEvent("逛街去"); //3注册观察者 weather.attach(girlfriend); weather.attach(mum); //4目标发布天气 weather.setSubjectState("明天天气多云,气温28度。"); }}推模型:
/** * 目标对象,它知道观察它的观察者,并提供注册(添加)和删除观察者的接口 */public class Subject { //用来保存注册的观察者对象 private List<Observer> observers=new ArrayList<>(); public void attach(Observer observer){ observers.add(observer); } /** * 删除集合中的指定观察者 * @param observer */ public void detach(Observer observer){ observers.remove(observer); } /** * 通知所有注册的观察者对象 */ protected void notifyObservers(String content){ for(Observer observer:observers){ observer.update(content); } }}
/** * 具体的目标对象,负责把有关状态存入到相应的观察者对象中 */public class ConcreteSubject extends Subject { //目标对象的状态 private String subjectState; public String getSubjectState() { return subjectState; } public void setSubjectState(String subjectState) { this.subjectState = subjectState; this.notifyObservers(subjectState); }}
/** * 这是一个观察者接口,定义更新的接口 * 给那些在目标发生变化的时候被通知的对象 */public interface Observer { /** * 更新的接口 * 传入目标对象,方便获取相应的目标对象的状态 * */ void update(String content);}
/** * 具体的观察者对象,实现更新的方法,使自身的状态和目标的状态保证一直 */public class ConcreteObserver implements Observer { //观察者的状态 private String observerState; private String name; private String event; /** * 获取目标类的状态同步到观察者的状态中 * */ @Override public void update(String content) { observerState=content; //observerState=((ConcreteSubject)subject).getSubjectState(); System.out.println(name+"收到了,"+observerState); System.out.println("他要去"+event); } public String getEvent() { return event; } public void setEvent(String event) { this.event = event; } public String getName() { return name; } public void setName(String name) { this.name = name; }}
public class Test { public static void main(String[] args){ //1创建目标 ConcreteSubject weather=new ConcreteSubject(); //2创建观察者 ConcreteObserver girlfriend=new ConcreteObserver(); girlfriend.setName("女朋友"); girlfriend.setEvent("去约会"); ConcreteObserver mum=new ConcreteObserver(); mum.setName("老妈"); mum.setEvent("逛街去"); //3注册观察者 weather.attach(girlfriend); weather.attach(mum); //4目标发布天气 weather.setSubjectState("明天天气多云,气温28度。"); }}
0 0
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- SMP对称多处理器结构
- 韶大talk 评论热度抽取
- MongoDB工作实战篇(一)
- FILE结构体详解
- MQ集群方式订阅消息
- 观察者模式
- linux主机之间 上传下载文件
- javascript-增加------createElement()方法
- MySQL 5.7.18 免安装版配置教程(亲测有效)【转】
- java零碎要点001--深入理解JVM_Java的堆内存_栈内存_以及运行时数据区的作用
- C++引用作为函数参数
- ssh登陆linux后台运行脚本不关闭
- 反向代理
- leetcode-9. Palindrome Number回文数