行为型模式11之1-Observer观察者模式例子理解
2016-02-18 10:08
811 查看
观察者模式中,一个被观察者管理所有相依于它的观察者物件,并且在本身的状态改变时主动发出通知。这通常通过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
角色
抽象被观察者角色:把所有对观察者对象的引用保存在一个集合中,每个被观察者角色都可以有任意数量的观察者。被观察者提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
具体被观察者角色:在被观察者内部状态改变时,给所有登记过的观察者发出通知。具体被观察者角色通常用一个子类实现。
具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。
适用场景
1) 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
2) 当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
3) 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。
例子一:java自带接口
1。被观察者实现
2。观察者实现
3。test
4。结果:
例子二:
1。被观察者接口
2。被观察者实现
3。观察者接口
4。观察者实现
5。test
6。结果
例子三:
1。被观察者接口
2。被观察者实现
3。观察者接口
4。观察者实现
5。test
6。结果
角色
抽象被观察者角色:把所有对观察者对象的引用保存在一个集合中,每个被观察者角色都可以有任意数量的观察者。被观察者提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
具体被观察者角色:在被观察者内部状态改变时,给所有登记过的观察者发出通知。具体被观察者角色通常用一个子类实现。
具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。
适用场景
1) 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
2) 当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
3) 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。
例子一:java自带接口
1。被观察者实现
package com.test.observermodel; import java.util.Observable; public class HouseObservable extends Observable { public HouseObservable(float price) { super(); this.price = price; } private float price; public float getPrice() { return price; } public void setPrice(float price) { super.setChanged();//设置变化点 super.notifyObservers(price);//通知价格变化 this.price = price; } @Override public String toString() { // TODO Auto-generated method stub return "房子的价格是:"+this.price; } }
2。观察者实现
package com.test.observermodel; import java.util.Observable; import java.util.Observer; public class HousePriceObserver implements Observer { private String observerName; @Override public void update(Observable o, Object arg) { // TODO Auto-generated method stub if (arg instanceof Float) { System.out.print(observerName+"观察到的价格改完:"); System.out.println(((Float)arg).floatValue()); } } public HousePriceObserver(String observerName) { super(); this.observerName = observerName; } }
3。test
package com.test.observermodel; public class Test { public static void main(String[] args) { testHouse(); } private static void testHouse() { // TODO Auto-generated method stub HouseObservable houseObservable=new HouseObservable(123000); HousePriceObserver observer1=new HousePriceObserver("观察者1"); HousePriceObserver observer2=new HousePriceObserver("观察者2"); HousePriceObserver observer3=new HousePriceObserver("观察者3"); houseObservable.addObserver(observer1); houseObservable.addObserver(observer2); houseObservable.addObserver(observer3); System.out.println(houseObservable); houseObservable.setPrice(8000); System.out.println(houseObservable); houseObservable.setPrice(200000); System.out.println(houseObservable); } }
4。结果:
房子的价格是:123000.0 观察者3观察到的价格改完:8000.0 观察者2观察到的价格改完:8000.0 观察者1观察到的价格改完:8000.0 房子的价格是:8000.0 观察者3观察到的价格改完:200000.0 观察者2观察到的价格改完:200000.0 观察者1观察到的价格改完:200000.0 房子的价格是:200000.0
例子二:
1。被观察者接口
package com.test.observermodel; public interface MyObservable { public void registerObserver(MyObserver er); public void removeObserver(MyObserver er); public void notifyAllObservers(); }
2。被观察者实现
package com.test.observermodel; import java.util.ArrayList; import java.util.List; public class MyObservabeImplJob implements MyObservable { private List<MyObserver> erList; private List<String> jobs; public MyObservabeImplJob() { super(); this.erList = new ArrayList<MyObserver>(); this.jobs = new ArrayList<String>(); } @Override public void registerObserver(MyObserver er) { // TODO Auto-generated method stub erList.add(er); } @Override public void removeObserver(MyObserver er) { // TODO Auto-generated method stub } @Override public void notifyAllObservers() { // TODO Auto-generated method stub for (MyObserver er: erList) { er.update(this); } } public void addJob(String job) { this.jobs.add(job); notifyAllObservers(); } public List<String> getJobs() { return jobs; } public String toString() { return jobs.toString(); } }
3。观察者接口
package com.test.observermodel; public interface MyObserver { public void update(MyObservable able); }
4。观察者实现
package com.test.observermodel; public class MyObserverImpl implements MyObserver{ private String name; @Override public void update(MyObservable able) { // TODO Auto-generated method stub System.out.println(this.name + "收到改变通知!"); //print job list System.out.println(able); } public MyObserverImpl(String name) { super(); this.name = name; } }
5。test
package com.test.observermodel; public class Test { public static void main(String[] args) { testJob(); } private static void testJob() { // TODO Auto-generated method stub MyObservabeImplJob jobCenter=new MyObservabeImplJob(); MyObserverImpl myObserverImpl1=new MyObserverImpl("观察者1"); MyObserverImpl myObserverImpl2=new MyObserverImpl("观察者2"); MyObserverImpl myObserverImpl3=new MyObserverImpl("观察者3"); jobCenter.registerObserver(myObserverImpl1); jobCenter.registerObserver(myObserverImpl2); jobCenter.registerObserver(myObserverImpl3); jobCenter.addJob("程序员"); jobCenter.addJob("护林员"); } }
6。结果
观察者1收到改变通知! [程序员] 观察者2收到改变通知! [程序员] 观察者3收到改变通知! [程序员] 观察者1收到改变通知! [程序员, 护林员] 观察者2收到改变通知! [程序员, 护林员] 观察者3收到改变通知! [程序员, 护林员]
例子三:
1。被观察者接口
package com.test.observermodel; public interface Watched { public void addWatcher(Watcher watcher); public void removeWatcher(Watcher watcher); public void notifyWatchers(); }
2。被观察者实现
package com.test.observermodel; import java.util.ArrayList; import java.util.List; public class WatchedImpl implements Watched { private List<Watcher> list = new ArrayList<Watcher>(); @Override public void addWatcher(Watcher watcher) { // TODO Auto-generated method stub list.add(watcher); } @Override public void removeWatcher(Watcher watcher) { // TODO Auto-generated method stub list.remove(watcher); } @Override public void notifyWatchers() { // TODO Auto-generated method stub for (Watcher watcher : list) { watcher.update(); } } void changeSomeValue(String value){ //do some notifyWatchers(); } }
3。观察者接口
package com.test.observermodel; public interface Watcher { public void update(); }
4。观察者实现
package com.test.observermodel; public class WatcherImpl implements Watcher{ private String name; public WatcherImpl(String name) { super(); this.name = name; } @Override public void update() { // TODO Auto-generated method stub System.out.println(name+"接到通知更新"); } }
5。test
package com.test.observermodel; public class Test { public static void main(String[] args) { testWatch(); } private static void testWatch() { // TODO Auto-generated method stub WatchedImpl watchedImpl=new WatchedImpl(); WatcherImpl watcherImpl1=new WatcherImpl("观察者1"); WatcherImpl watcherImpl2=new WatcherImpl("观察者2"); WatcherImpl watcherImpl3=new WatcherImpl("观察者3"); watchedImpl.addWatcher(watcherImpl1); watchedImpl.addWatcher(watcherImpl2); watchedImpl.addWatcher(watcherImpl3); watchedImpl.changeSomeValue("111"); } }
6。结果
观察者1接到通知更新 观察者2接到通知更新 观察者3接到通知更新
相关文章推荐
- 给进程设置实时优先级
- Unity在移动平台中的文件操作路径详解
- Windows下使用Hadoop2.6.0-eclipse-plugin插件
- 七个对我最重要的职业建议(译文)
- Python文本处理常用代码总结(一)
- 笔记4,jQuery选择器
- ORA-12154_TNS无法解析指定的连接标识符
- 图片存储+添加到媒体库
- windows下eclipse调试hadoop详解
- [WC 2006]水管局长
- session和cookie
- Spring Boot 快速入门
- Pointable类----------leapmotionAPI
- 笔记3,基本语法
- 码农十年连载三
- 自学前端初学心得
- Linux的ulimit各种限制之深入分析
- oracle dump文件说明--未发生迁移
- storm并行机制
- LeeCode_139 Word Break