一、定义观察者类
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")); } }
运行结果: