本文虽为原创,但大量参考了<<设计模式之禅>>一书 本博客可作为<<设计>>艺术观察者模式的读书笔记
在程序中存在若干个对象,现在有一种情况,一个对象改变了,要使得别的对象都知道它的改变.如何?用代码来设计一下.
为了方便叙述,我们引入一个例子,在战国时期的李斯,韩非.韩非的状态改变后,他都要通知李斯.
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图
不过这是最简单也最纯净的观察者模式
下一节 咱们聊聊一个稍微复杂一点的