行为型模式11之1-Observer观察者模式例子理解
来源:互联网 发布:凡科建站 源码 编辑:程序博客网 时间:2024/06/14 01:14
观察者模式中,一个被观察者管理所有相依于它的观察者物件,并且在本身的状态改变时主动发出通知。这通常通过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
角色
抽象被观察者角色:把所有对观察者对象的引用保存在一个集合中,每个被观察者角色都可以有任意数量的观察者。被观察者提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
具体被观察者角色:在被观察者内部状态改变时,给所有登记过的观察者发出通知。具体被观察者角色通常用一个子类实现。
具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。
适用场景
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接到通知更新
0 0
- 行为型模式11之1-Observer观察者模式例子理解
- 11种行为型模式之:观察者模式 (Observer)
- 行为型模式之观察者OBSERVER
- 行为型模式-观察者observer
- 设计模式----行为型模式之观察者模式(Observer Pattern)
- 设计模式----行为型模式之观察者模式(Observer Pattern)
- 设计模式----行为型模式之观察者模式(Observer Pattern)
- 设计模式----行为型模式之观察者模式(Observer Pattern)
- 设计模式----行为型模式之观察者模式(Observer Pattern)
- 设计模式----行为型模式之观察者模式(Observer Pattern)
- 设计模式----行为型模式之观察者模式(Observer Pattern)
- 设计模式----行为型模式之观察者模式(Observer Pattern)
- 【设计模式】行为模式之Observer观察者
- 观察者模式(observer行为型)c#简单例子
- 设计模式笔记--行为型模式之七Observer--观察者
- 行为型模式之观察者模式(Observer)
- 设计模式(行为型)之观察者模式(Observer Pattern)
- 行为型模式之观察者模式(Observer)
- Windows下使用Hadoop2.6.0-eclipse-plugin插件
- Map、List、Set用法及区别
- UI操作 解决方案
- 七个对我最重要的职业建议(译文)
- JAVA中类型转换
- 行为型模式11之1-Observer观察者模式例子理解
- WAMP服务器离线,80端口被Microsoft-HTTPAPI/2.0占用
- Hibernate之hibernate中java对象的状态
- 安装lsb_release
- 微信红包算法
- 笔记5,jQuery中的事件
- KVM架构与原理详解
- 例题6-15 UVa10305 Ordering Tasks(拓扑排序)
- 2-18学习记录