谈谈观察者模式

本文虽为原创,但大量参考了<<设计模式之禅>>一书 本博客可作为<<设计>>艺术观察者模式的读书笔记

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

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

 

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图



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

下一节 咱们聊聊一个稍微复杂一点的

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值