为什么我们会选择观察者模式呢:
如果一个对象的数值或者状态发生变化,依赖于他的很多的对象的都需要跟随发生变化.如果依赖他的对象非常多.那么观察者是我们首先考虑的模式之一
今天我们讲解观察者模式:举个简单的例子说明.
就拿我们早上挤公交车来说:
观察者:代表自己以及其他向挤上公交车的人.
被观察者:就是公交车.
当然这个例子举的有点不恰当,那就是 公交车的位置跟坐标的变化是没办法通知到我们的,我们只能够了解到眼前的情况,除非你公交车公司有人哈哈.
下面的情况 假设我们有公交车定位系统 就拿这个例子说明我们的观察者模式:
主题类图如下:
好了直接写方法了:
/**
* 公交车 被观察者类
* @author 0001
*
*/
public class Bus extends Observable{
//位置的改变
public void position(){
this.trace("公交车位置发生变化");
super.setChanged();//通知所有观察者
super.notifyObservers("公交车慢悠悠的爬过来");
}
//人数的变化
public void personChange(){
this.trace("人数已10的N次方不断的暴增");
super.setChanged();
super.notifyObservers("向上的车的准备战斗了,已经超载了");
}
public void trace(String message){
System.out.println(message);
}
}
观察者类:
/**
* 一定一类人
* @author 0001
*
*/
public interface PersonCategory {
public void reportBoss(String context);
}
/**
* 定义上班族
* @author 0001
*/
public class OfficeWork implements Observer,PersonCategory{
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
System.out.println("好不容易等来公交车");
this.reportBoss(arg.toString());
}
public void reportBoss(String context) {
// TODO Auto-generated method stub
System.out.println("给老板打个电话:公交车挤不上去 ,晚点到公司. 老板无语了");
}
}
/**
* 小偷
*/
import java.util.Observable;
import java.util.Observer;
public class Thief implements Observer,PersonCategory{
public void reportBoss(String context) {
// TODO Auto-generated method stub
System.out.println("报告老板 ,偷了一部Iphone 4s,5s哦");
}
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
System.out.println("马上开工了");
this.reportBoss(arg.toString());
}
}
测试类:
import java.util.Observer;
public class ClientTest {
public static void main(String args[]){
PersonCategory pcDemo=new OfficeWork();
Bus bus=new Bus();
bus.addObserver((Observer) pcDemo);
bus.personChange();
System.out.println("==================================>");
//小偷
PersonCategory thiefDemo=new Thief();
bus.addObserver((Observer) thiefDemo);
bus.personChange();
}
}
输出结果
人数已10的N次方不断的暴增
好不容易等来公交车
给老板打个电话:公交车挤不上去 ,晚点到公司. 老板无语了
==================================>
人数已10的N次方不断的暴增
马上开工了
报告老板 ,偷了一部Iphone 4s,5s哦
好不容易等来公交车
给老板打个电话:公交车挤不上去 ,晚点到公司. 老板无语了
分析结果:
所有的观察者都会受到被观察者发出来的信息.