十一、观察者模式(Observable、Observer)

时间:2023-07-05 16:46:07

老板出差了,员工1、员工2..均放羊中。他们请求前台的秘书,当老板回来时通知自己,免得被Boss抓个现行。秘书想了想,说————嗯,这是观察者模式。

当一个对象的改变需要同时改变其它对象,而且它不知道具体有多少方法需要改变时,应该考虑使用观察者模式————摘自《大话设计模式》
 
 Ps:本例用Java类库中的Observable和Observer实现
 基本结构:
 ①、抽象通知者,接口
 抽象的通知方法

②、通知者,继承Observable
 通知方法,在该方法内条件判断setChange的执行与否,继而决定后续的notifyObservers是否执行

③、观察者,实现Observer接口
 覆写的update方法,当“通知者”的notifyObservers方法执行时,update被调用

④、调用者
 创建通知者A
 创建观察者B
 通过addObserver方法建立委托关系
 调用通知方法

代码演示:文章开篇的例子
 ①、抽象通知者#########################################

/**
* 抽象的通知者
*/
public interface Subject {
public void setAction(String action); //设置行为
public String getAction(); //获取行为
public void inform();
}

②、通知者#########################################

/**
* 秘书,当老板回来时通知观察者
*/
public class Secretary extends Observable implements Subject{
private String action; //行为 @Override
public void inform(){
if(action!=null && !"".equals(action)){
this.setChanged();//只有当改变发生时,即setChange方法被触发时,才调用下面的通知方法notifyObservers
}
this.notifyObservers();//调用各个观察者的update方法
} @Override
public String getAction() {
return action;
} @Override
public void setAction(String action) {
this.action = action;
}
}

③、观察者#########################################

/**
* 观察者1,正在打魔兽
*/
public class Member1 implements Observer{
String name; //观察者姓名 public Member1(String name){
this.name = name;
} public void stopGame(){ //停止游戏
System.out.println(name+"请停止打魔兽,继续工作!");
} @Override
public void update(Observable o, Object arg) {
Subject sub = (Subject) o;
System.out.print(sub.getAction()+","); //得到行为
stopGame();
}
}
/**
* 观察者2,正在大声谈笑
*/
public class Member2 implements Observer{
String name; //观察者姓名 public Member2(String name){
this.name = name;
} public void stopNoise(){ //停止游戏
System.out.println(name+"请停止喧闹,继续工作!");
} @Override
public void update(Observable o, Object arg) {
Subject sub = (Subject) o;
System.out.print(sub.getAction()+","); //得到行为
stopNoise();
}
}

④、调用者#########################################

public class Test {
public static void main(String[] args) throws Exception {
Secretary s = new Secretary(); Member1 m1 = new Member1("张三"); //成员1
Member2 m2 = new Member2("李四"); //成员2 s.addObserver(m1); //成员1建立委托
s.addObserver(m2); //成员2建立委托 s.setAction("老板回来啦");
s.inform(); //通知
}
}

运行结果:
 老板回来啦,李四请停止喧闹,继续工作!
 老板回来啦,张三请停止打魔兽,继续工作!