十一、观察者模式(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(); //通知

	}

}

 

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

 

你可能感兴趣的:(observer)