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

 老板出差了,员工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(); //通知
	}
}

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

原文地址:https://www.cnblogs.com/suncoolcat/p/3327476.html