谈谈观察者模式
2014-05-21 10:38
162 查看
本文虽为原创,但大量参考了<<设计模式之禅>>一书 本博客可作为<<设计>>艺术观察者模式的读书笔记
在程序中存在若干个对象,现在有一种情况,一个对象改变了,要使得别的对象都知道它的改变.如何?用代码来设计一下.
为了方便叙述,我们引入一个例子,在战国时期的李斯,韩非.韩非的状态改变后,他都要通知李斯.
测试结果
韩非子在吃饭
李斯得告诉秦始皇---->韩非子在吃饭
韩非子在睡觉
李斯得告诉秦始皇---->韩非子在睡觉
很简单但是有几个问题.
1韩非呀.那么厉害的人,难道注意韩非的人就李斯一个,张斯,王斯不关注?
嗯,哪这个简单,刚才的程序里,韩非里面只是嵌入了要给李斯,我现在给韩非嵌入一个list作为要通知的所有人.就ok.
2那整个战国像韩非的那样的牛人也不少,那陈非,李非也得嵌入要通知的人?
那就在AbstructPerson里嵌入.同时既然有了list那响应的add,remove也得有.
话不多说,看代码.
测试结果
韩非子在吃饭
李斯得告诉秦始皇---->韩非子在吃饭
王斯得告诉他主子---->韩非子在吃饭
韩非子在睡觉
李斯得告诉秦始皇---->韩非子在睡觉
王斯得告诉他主子---->韩非子在睡觉
ok 问题解决
uml图
不过这是最简单也最纯净的观察者模式
下一节 咱们聊聊一个稍微复杂一点的
在程序中存在若干个对象,现在有一种情况,一个对象改变了,要使得别的对象都知道它的改变.如何?用代码来设计一下.
为了方便叙述,我们引入一个例子,在战国时期的李斯,韩非.韩非的状态改变后,他都要通知李斯.
package observer; public abstract class AbstractPerson { //人都能睡觉 吃饭 韩非也一样 public abstract void eat(); public abstract void sleep(); } package observer; public class HanFei extends AbstractPerson{ private LiSi lisi; public HanFei(LiSi lisi){ this.lisi=lisi; } @Override public void eat() { // TODO Auto-generated method stub System.out.println("韩非子在吃饭"); lisi.update("韩非子在吃饭"); } @Override public void sleep() { // TODO Auto-generated method stub System.out.println("韩非子在睡觉"); lisi.update("韩非子在睡觉"); } } package observer; public interface Observer { public void update(String context); } package observer; public class LiSi implements Observer { @Override public void update(String context) { // TODO Auto-generated method stub report(context); } public void report(String context){ System.out.println("李斯得告诉秦始皇---->"+context); } } package observer; public class Client { public static void main(String[] args) { LiSi liSi=new LiSi(); HanFei hanFei=new HanFei(liSi); hanFei.eat(); hanFei.sleep(); } }
测试结果
韩非子在吃饭
李斯得告诉秦始皇---->韩非子在吃饭
韩非子在睡觉
李斯得告诉秦始皇---->韩非子在睡觉
很简单但是有几个问题.
1韩非呀.那么厉害的人,难道注意韩非的人就李斯一个,张斯,王斯不关注?
嗯,哪这个简单,刚才的程序里,韩非里面只是嵌入了要给李斯,我现在给韩非嵌入一个list作为要通知的所有人.就ok.
2那整个战国像韩非的那样的牛人也不少,那陈非,李非也得嵌入要通知的人?
那就在AbstructPerson里嵌入.同时既然有了list那响应的add,remove也得有.
话不多说,看代码.
package observer; import java.util.ArrayList; public abstract class Subject protected ArrayList<Observer> list; public void add(Observer obe){ list.add(obe); } public void remove(Observer obe){ list.remove(obe); } public void notify(String context){ for(Observer obe:list){ obe.update(context); } } } package observer; import java.util.ArrayList; public class HanFei extends Subject implements AbstructPerson{ public HanFei(){ this.list=new ArrayList<Observer>(); } public void eat() { // TODO Auto-generated method stub System.out.println("韩非子在吃饭"); notify("韩非子在吃饭"); } public void sleep() { // TODO Auto-generated method stub System.out.println("韩非子在睡觉"); notify("韩非子在睡觉"); } } package observer; public class LiSi implements Observer { @Override public void update(String context) { // TODO Auto-generated method stub report(context); } public void report(String context){ System.out.println("李斯得告诉秦始皇---->"+context); } } package observer; public class WangSi implements Observer { @Override public void update(String context) { // TODO Auto-generated method stub report(context); } public void report(String context){ System.out.println("王斯得告诉他主子---->"+context); } } package observer; public class Client { public static void main(String[] args) { LiSi liSi=new LiSi(); WangSi wangSi=new WangSi(); HanFei hanFei=new HanFei(); hanFei.add(liSi); hanFei.add(wangSi); hanFei.eat(); hanFei.sleep(); } }
测试结果
韩非子在吃饭
李斯得告诉秦始皇---->韩非子在吃饭
王斯得告诉他主子---->韩非子在吃饭
韩非子在睡觉
李斯得告诉秦始皇---->韩非子在睡觉
王斯得告诉他主子---->韩非子在睡觉
ok 问题解决
uml图
不过这是最简单也最纯净的观察者模式
下一节 咱们聊聊一个稍微复杂一点的
相关文章推荐
- 谈谈JS的观察者模式(自定义事件)
- 谈谈JS的观察者模式(自定义事件)
- 谈谈观察者模式
- 谈谈JS的观察者模式(自定义事件)
- 谈谈我对观察者模式的一些理解
- 观察者模式
- 观察者模式探秘
- 观察者(Observer)模式
- Java设计模式之Observer(观察者)模式
- 用 spring 实现观察者设计模式
- 模式笔记——观察者模式
- 探究观察者设计模式
- 模式实践:观察者模式与Spring
- Observer Pattern(观察者模式)及其在C#中的实现
- 和依赖的斗争——谈谈使用模式前后的依赖关系变化
- 深入浅出观察者模式
- 观察者模式-新用模式
- 设计模式之观察者模式 (原创)
- 【 应用以及剖析】之 java.util.Observer 观察者模式实现
- 设计模式PHP5实现之----观察者(Observer)