zoukankan      html  css  js  c++  java
  • 十一、观察者模式(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(); //通知
    	}
    }

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

  • 相关阅读:
    计算机操作系统 存储器管理
    数据结构 平衡二叉树avl c++
    数据结构 线索二叉树 c++
    数据结构 赫夫曼树及其应用 c++
    c++ cstring 常用函数
    数据结构 哈希表 c++
    数据结构 静态链表
    ajax返回填充的数据不显示
    使用JSON.parse()转化成json对象需要注意的地方
    参数错误导致bug
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3327476.html
Copyright © 2011-2022 走看看