观察者模式(Observer Pattern)
2016-05-31 23:52
393 查看
观察者模式:定义了对象之间的一对多依赖,这样依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
下面举一个具体例子:
两个观察者,BinaryObserver的update将setState传入的整数转换成二进制,OctaObserver则是转成八进制
测试代码:
在Swing中有使用到观察者模式,比如JButton的addActionListener方法。
下面举一个具体例子:
两个观察者,BinaryObserver的update将setState传入的整数转换成二进制,OctaObserver则是转成八进制
interfaceSubject{ privateList<Observer>observers; publicvoidregisterObserver(Observero); publicvoidremoveObserver(Observero); publicvoidnotifyAllObservers(); }
publicclassConcreteSubjectimplementsSubject{ privateList<Observer>observers =newArrayList<Observer>(); privateintstate; publicintgetState(){ returnstate; } publicvoidsetState(intstate){ this.state=state; notifyAllObservers(); } publicvoidregisterObserver(Observerobserver){ observers.add(observer); } publicvoidremoveObserver(Observerobserver){ inti=observers.indexOf(observer); if(i>=0) observers.remove(i); } publicvoidnotifyAllObservers(){ for(Observerobserver:observers){ observer.update(); } } }
abstractObserver{ publicabstractvoidupdate(); }
publicclassBinaryObserverimplementsObserver{
Subjectsubject;
publicBinaryObserver(Subjectsubject){
this.subject=subject;
this.subject.attach(this);
}
@Override
publicvoidupdate(){
System.out.println("BinaryString:"
+Integer.toBinaryString(subject.getState()));
}
}
publicclassOctalObserverimplementsObserver{
Subjectsubject;
publicOctalObserver(Subjectsubject){
this.subject=subject;
this.subject.attach(this);
}
@Override
publicvoidupdate(){
System.out.println("OctalString:"
+Integer.toOctalString(subject.getState()));
}
}
测试代码:
Subjectsubject=newConcreteSubject();
Observero=newOctalObserver(subject);
Observerb=newBinaryObserver(subject);
subject.registerObserver(o);
subject.registerObserver(b);
subject.setState(15);
subject.setState(10);
在Swing中有使用到观察者模式,比如JButton的addActionListener方法。
相关文章推荐
- C#中Length和Count的区别(个人观点)
- QT GUI(主)线程与子线程之间的通信——使用跨线程的信号槽
- Hard-题目45:140. Word Break II
- DKMS Create RPM Notes-1
- Hard-题目44:30. Substring with Concatenation of All Words
- 【备忘】C#语言基础-1
- chrome49浏览器 以上跨域
- Hard-题目43:174. Dungeon Game
- 初入ACM
- Hard-题目42:321. Create Maximum Number
- 日常css技巧小结(1)--背景透明度改变对内容无影响
- 高效学习Linux驱动开发
- 我的新浪博客
- Hard-题目41:76. Minimum Window Substring
- 一天一个shell命令 文本操作系列-comm命令用法
- iOS开发探索-多线程(NSThread、NSOperation、GCD)编程浅谈
- HDU 1175 连连看 (BFS 或者 DFS)
- Hard-题目40:132. Palindrome Partitioning II
- 团队项目-个人博客5.31
- 根据用户输入年和月份值,输出对应月份的天数。