观察者模式【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"));
}

}

 运行结果:



原文地址:https://www.cnblogs.com/edisonfeng/p/2289096.html