定义:定义对象间一种一对多的依赖关系,是的每当一个对象改变状态,则所有依赖于他的对象都会得到通知并被自动更新.
我们先来解释一下观察者模式的几个角色名称:
- Subject被观察者:定义被观察者必须实现的职责,它必须能够动态地增加、取消观察者。它一般是抽象类或者是实现类,仅仅完成作为被观察这必须实现的职责:管理观察者并通知观察者。
- Observer观察者:观察者接收到消息后,机进行update(更新方法)操作,对接收到的信息进行处理。
- ConcreteSubject具体的被观察者:定义被观察者自己的业务逻辑,同时定义对哪些事情进行通知。
- ConcreteObserver具体的观察者:每个观察在接收到消息后的处理反应是不同,各个观察者有自己的处理逻辑。
由于Java给我们已经封装好了Observer和Observable.所以我们的代码就很简略了,下面上通用代码.
1.HanFeiZi.java 定义被观察者
public class HanFeiZi extends Observable{
//韩非子要吃饭了
public void haveBreakfast(){
System.out.println("韩非子:开始吃饭了...");
//通知所有的观察者
super.setChanged();
super.notifyObservers("韩非子在吃饭");
}
//韩非子开始娱乐了,古代人没啥娱乐,你能想到的就那么多
public void haveFun(){
System.out.println("韩非子:开始娱乐了...");
super.setChanged();
this.notifyObservers("韩非子在娱乐");
}
}
2.定义观察者
public class LiSi implements Observer{
//首先李斯是个观察者,一旦韩非子有活动,他就知道,他就要向老板汇报
public void update(Observable observable,Object obj){
System.out.println("李斯:观察到李斯活动,开始向老板汇报了...");
this.reportToQiShiHuang(obj.toString());
System.out.println("李斯:汇报完毕,秦老板赏给他两个萝卜吃吃...\n");
try {
System.out.println("我开始休眠 " + System.currentTimeMillis());
Thread.sleep(3000);
System.out.println("我起来了 " + System.currentTimeMillis());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//汇报给秦始皇
private void reportToQiShiHuang(String reportContext){
System.out.println("李斯:报告,秦老板!韩非子有活动了--->"+reportContext);
}
}
public class LiuSi implements Observer{
//刘斯,观察到韩非子活动后,自己也做一定得事情
public void update(Observable observable,Object obj){
System.out.println("刘斯:观察到韩非子活动,开始动作了...");
this.happy(obj.toString());
System.out.println("刘斯:真被乐死了\n");
}
//一看韩非子有变化,他就快乐
private void happy(String context){
System.out.println("刘斯:因为" +context+",——所以我快乐呀!" );
}
}
public class WangSi implements Observer{
//王斯,看到李斯有活动,自己就受不了
public void update(Observable observable,Object obj){
System.out.println("王斯:观察到韩非子活动,自己也开始活动了...");
this.cry(obj.toString());
System.out.println("王斯:真真的哭死了...\n");
}
//一看李斯有活动,就哭,痛哭
private void cry(String context){
System.out.println("王斯:因为"+context+",——所以我悲伤呀!");
}
}
3.场景类
public class Client {
public static void main(String[] args) {
//三个观察者产生出来
Observer liSi = new LiSi();
Observer wangSi = new WangSi();
Observer liuSi = new LiuSi();
//定义出韩非子
HanFeiZi hanFeiZi = new HanFeiZi();
//我们后人根据历史,描述这个场景,有三个人在观察韩非子
hanFeiZi.addObserver(wangSi);
hanFeiZi.addObserver(liuSi);
hanFeiZi.addObserver(liSi);
//然后这里我们看看韩非子在干什么
hanFeiZi.haveBreakfast();
}
}