观察者模式【java版】
一、定义观察者类
1)观察者DiningObserver
public class DiningObserver implements Observer {
//只需要实现Observer接口中的update方法
public void update(Observable o, Object arg) {
if(arg.equals("Dining") ){
System.out.println("我是观察者DiningObserver,当前被观察者的状态为:Dining!");
}else{
System.out.println("我是观察者DiningObserver,但状态不匹配");
}
}
}
2)观察者SleepingObserver
public class SleepingObserver implements Observer {
//只需要实现Observer接口中的update方法
public void update(Observable o, Object arg) {
if(arg.equals("Sleeping") ){
System.out.println("我是观察者SleepingObserver,当前被观察者的状态为:Sleeping!");
}else{
System.out.println("我是观察者SleepingObserver,但状态不匹配");
}
}
}
3)观察者WorkingObserver
public class WorkingObserver implements Observer {
//只需要实现Observer接口中的update方法
public void update(Observable o, Object arg) {
if(arg.equals("Working") ){
System.out.println("我是观察者WorkingObserver,当前被观察者的状态为:Working!");
}else{
System.out.println("我是观察者WorkingObserver,但状态不匹配");
}
}
}
二、定义被观察者类
public class ConcreteObserved extends Observable {
public ConcreteObserved(String state) {
this.state=state;
}
/*
* 使用者基本只需要自己定义一个方法,决定在什么情况下通知所有观察者
* 在自定义的这个方法里,都是直接调用父类的方法
*/
public void modifyState(String state){
this.state=state;
setChanged();//一定要设置改变位
notifyObservers(this.state);//将参数通知到每个观察者
//通知完之后会自动调用clearChanged方法
}
private String state;
}
三、测试
public class Main {
public static void main(String[] args) {
System.out.println("开始测试观察者模式。。。");
//创建三个观察者
DiningObserver theDiningObserver=new DiningObserver();
SleepingObserver theSleepingObserver=new SleepingObserver();
WorkingObserver theWorkingObserver=new WorkingObserver();
//创建一个被观察者
ConcreteObserved theConcreteObserved=new ConcreteObserved(new String("NoState"));
//将三个观察者都添加到被观察者的观察者列表中
theConcreteObserved.addObserver(theDiningObserver);
theConcreteObserved.addObserver(theSleepingObserver);
theConcreteObserved.addObserver(theWorkingObserver);
//被观察者状态发生改变
theConcreteObserved.modifyState(new String("Dining"));
}
}
运行结果: