设计模式---观察者模式(学习笔记)
2014-04-19 00:32
363 查看
观察者模式的定义:当一个主题对象(或是可观察者)的状态发生改变时,其它依赖者(观察者)都会收到通知。
下面的Demo是基于Java jar包中的观察者来写的:
首先看主题对象的代码部分:
依赖者一的代码:
I am ReceverTwo,I have receiver:Hello ,this is the first notifition
I am ReceverOne,I have receiver:Hello ,this is the first notifition
看结果可知:编程时不要依赖观察者被通知的顺序!
接下来所介绍的是自定义观察者模式:
先定义要成为观察者的接口,这是主题接口,对象使用此接口注册为观察者,或者从观察者中移除(这个是成为观察者的条件)
然后再创建一个具体的观察者
最后进行测试,发送一个通知:
哎,这个写的太乱啦!概念上不是太清楚,有书上直接写为 主题(注册,移除,通知更新的类)和观察者(实现update方法的)进行区分,代码还是清楚的
下面的Demo是基于Java jar包中的观察者来写的:
首先看主题对象的代码部分:
import java.util.Observable; public class ObserverSubject extends Observable { public ObserverSubject() { super(); // TODO Auto-generated constructor stub } public void sendNotify(String content){ setChanged(); notifyObservers(content); } }两个依赖者的代码部分:
依赖者一的代码:
import java.util.Observable; import java.util.Observer; public class ReceverOne implements Observer { Observable observable; public ReceverOne(Observable observable) { super(); this.observable = observable; this.observable.addObserver(this); } @Override public void update(Observable o, Object arg) { // TODO Auto-generated method stub if(o instanceof ObserverSubject){ System.out.println("I am ReceverOne,I have receiver:"+arg.toString()); } } }
依赖者二的代码
import java.util.Observable; import java.util.Observer; public class ReceverTwo implements Observer { Observable observable; public ReceverTwo(Observable observable) { super(); this.observable = observable; this.observable.addObserver(this); } @Override public void update(Observable o, Object arg) { // TODO Auto-generated method stub if(o instanceof ObserverSubject){ System.out.println("I am ReceverTwo,I have receiver:"+arg.toString()); } } }发送一个消息测试这个观察者模式:
public static void main(String[] args) { // TODO Auto-generated method stub ObserverSubject observer=new ObserverSubject(); new ReceverOne(observer); new ReceverTwo(observer); observer.sendNotify("Hello ,this is the first notifition"); }以上代码运行的结果为:
I am ReceverTwo,I have receiver:Hello ,this is the first notifition
I am ReceverOne,I have receiver:Hello ,this is the first notifition
看结果可知:编程时不要依赖观察者被通知的顺序!
接下来所介绍的是自定义观察者模式:
先定义要成为观察者的接口,这是主题接口,对象使用此接口注册为观察者,或者从观察者中移除(这个是成为观察者的条件)
public interface DefineObservAble { void registerObserver(DefineObserver observer); void removeObserver(DefineObserver observer); void notifyObserver(Object o); }再定义观察者的接口,所有潜在的观察者,都必须实现这个接口----观察者接口,有通知时调用uPdate方法(这个是观察者的义务)
public interface DefineObserver { void update(Object o); }
然后再创建一个具体的观察者
public class MyObservAble implements DefineObservAble { private ArrayList observers=null; public MyObservAble(){ observers=new ArrayList<>(); } @Override public void registerObserver(DefineObserver observer) { // TODO Auto-generated method stub if(observers==null)return; synchronized(observers){ int i=observers.indexOf(observer); if(i==-1){ observers.add(observer); } } } @Override public void removeObserver(DefineObserver observer) { // TODO Auto-generated method stub if(observers==null)return; synchronized (observer) { int i=observers.indexOf(observer); if(i!=-1){ observers.remove(i); } } } @Override public void notifyObserver(Object o) { // TODO Auto-generated method stub if(observers==null)return; int size=observers.size(); for(int i=0;i<size;i++){ DefineObserver observer=(DefineObserver) observers.get(i); observer.update(o); } } public void sendNotify(String content){ notifyObserver(content); } }创建两个可以用于观察的类:
public class ObserverOne implements DefineObserver { public ObserverOne(DefineObservAble able) { able.registerObserver(this); } @Override public void update(Object o) { // TODO Auto-generated method stub System.out.println("This is the DefineObserver,I am ObserverOne, I have receive:"+o); } } public class ObserverTwo implements DefineObserver { public ObserverTwo(DefineObservAble able) { able.registerObserver(this); } @Override public void update(Object o) { // TODO Auto-generated method stub System.out.println("This is the DefineObserver,I am ObserverTwo, I have receive:"+o); } }
最后进行测试,发送一个通知:
/** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub MyObservAble able=new MyObservAble(); new ObserverOne(able); new ObserverTwo(able); able.sendNotify(" hello world!"); }
哎,这个写的太乱啦!概念上不是太清楚,有书上直接写为 主题(注册,移除,通知更新的类)和观察者(实现update方法的)进行区分,代码还是清楚的
相关文章推荐
- [知了堂学习笔记]设计模式之观察者模式
- 【知了堂学习笔记】——设计模式之观察者模式
- 设计模式学习笔记——观察者(Observer)模式
- 设计模式学习笔记-观察者模式
- 设计模式学习笔记——观察者模式
- 设计模式学习笔记--观察者(Observer)模式
- 【设计模式学习笔记】观察者模式
- 设计模式学习笔记-观察者模式
- 11. JAVA常用类库 Part 4 (对象克隆技术clone、Arrays类、Comparable接口、比较器Comparator、观察者设计模式) ----- 学习笔记
- 设计模式C++学习笔记之十六(Observer观察者模式)
- 设计模式C++学习笔记之十六(Observer观察者模式)
- 观察者设计模式--学习笔记
- java学习笔记-设计模式16(观察者模式)
- 【设计模式】学习笔记2:观察者模式(Observer)
- 设计模式学习笔记--Observer Pattern观察者模式
- 设计模式学习笔记之-观察者模式
- Java-马士兵设计模式学习笔记-观察者模式-读取properties文件改成单例模式
- 【知了堂学习笔记】_Java中设计模式之观察者模式的学习
- 设计模式学习笔记——观察者模式
- 设计模式学习笔记-观察者模式