您的位置:首页 > 其它

谈谈观察者模式

2014-05-21 10:38 162 查看
本文虽为原创,但大量参考了<<设计模式之禅>>一书 本博客可作为<<设计>>艺术观察者模式的读书笔记

在程序中存在若干个对象,现在有一种情况,一个对象改变了,要使得别的对象都知道它的改变.如何?用代码来设计一下.

为了方便叙述,我们引入一个例子,在战国时期的李斯,韩非.韩非的状态改变后,他都要通知李斯.

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图



不过这是最简单也最纯净的观察者模式

下一节 咱们聊聊一个稍微复杂一点的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: