Java设计模式-观察者模式
来源:互联网 发布:customrules.js 编辑:程序博客网 时间:2024/06/03 17:50
1、概念
观察者(Observer)模式定义:在对象之间定义了一对多的依赖关系,这样一来,当一个对象改变状态时,依赖它的对象都会收到通知并自动更新。Java已经提供了对观察者Observer模式的默认实现, Java对观察者模式的支持主要体现在Observable类和Observer接口。
2、代码实现
1、Java默认实现
/** * 被观察者 */ class Food extends Observable { /** 菜价 */ private float price; public Food(float price) { this.price = price; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; //核心代码 this.setChanged(); /** *通知所有注册者,并回调Observer的update方法 */ this.notifyObservers(price); } }
/** * 顾客 --观察者 */ class Customer implements Observer { //重写update方法 @Override public void update(Observable o, Object arg) { if (o instanceof Food && arg instanceof Float) { Food food = (Food) o; float price = (Float) arg; System.out.println(price); } }}
/** * 测试类 */ public class Test { public static void main(String[] args) { Food food = new Food(1.0f); Customer customer1 = new Customer(); Customer customer2 = new Customer(); //注册 food.addObserver(customer1); food.addObserver(customer2); food.setPrice(1.5f); } }
2、自实现观察者模式
//抽象的观察者public interface Watcher { public void update(); }
//抽象的被观察者public interface Watched { public void addWatcher(Watcher watcher); public void removeWatcher(Watcher watcher); public void notifyWatchers(); }
3个观察者
public class Security implements Watcher { @Override public void update() { System.out.println("Security"); } } public class Thief implements Watcher { @Override public void update() { System.out.println("Thief"); } }public class Police implements Watcher { @Override public void update() { System.out.println("Police"); } }
被观察者实现
public class Transporter implements Watched { private List<Watcher> list = new ArrayList<Watcher>(); @Override public void addWatcher(Watcher watcher) { list.add(watcher); } @Override public void removeWatcher(Watcher watcher) { list.remove(watcher); } @Override public void notifyWatchers(String str) { for (Watcher watcher : list) { watcher.update(); } }}
//测试类public class Test { public static void main(String[] args) { Transporter transporter = new Transporter(); Police police = new Police(); Security security = new Security(); Thief thief = new Thief(); transporter.addWatcher(police); transporter.addWatcher(security); transporter.addWatcher(security); transporter.notifyWatchers(); } }
这里这是简单的自定义观察者模式,其中观察者模式分为推模型和拉模型。
(1)推模型
被观察者对象向观察者推送详细信息,不管观察者是否需要,推送的信息通常是被观察者对象的全部或部分数据。
(2)拉模型
被观察者对象在通知观察者的时候,只传递少量信息,如果观察者需要更具体的信息,由观察者主动到被观察者对象中获取,相当于是观察者从被观察者对象中拉数据。一般这种模型的实现中,会把被观察者对象自身通过update()方法传递给观察者,这样在观察者需要获取数据的时候,就可以通过这个引用来获取了。
拉模式的抽象观察者
public interface Observer { /** * 更新接口 * @param subject 传入被观察者对象,方便获取相应的主题对象的状态 */ public void update(Observable observable);}
阅读全文
0 0
- java设计模式-----观察者
- JAVA 观察者设计模式
- java观察者设计模式
- java观察者设计模式
- java 观察者设计模式
- JAVA-观察者设计模式
- JAVA设计模式--观察者
- Java---观察者设计模式
- Java设计模式:观察者
- Java设计模式-观察者
- java观察者设计模式
- java设计模式-观察者模式
- java设计模式---观察者模式
- java设计模式---观察者模式
- java设计模式---观察者模式
- java设计模式-----观察者模式
- java 设计模式---->观察者模式
- java设计模式----观察者模式
- 万能头文件 #include<bits/stdc++.h>
- QSS美化之QPushButton
- Spring Boot 与 Spark的整合
- ant介绍
- std::condition_variable
- Java设计模式-观察者模式
- LeetCode@DFS_257_Binary_Tree_Paths
- css3text-transform,用来控制文本的大小写属性
- python2.7 32位 和 PyDev 4.2.0 32位
- Intent
- Python学习之旅-19
- 集合和数组之间的转化
- 解决win系统点击右键时鼠标一直不停转圈操作
- Fiddler怎么对手机的数据进行代理抓包分析