• Java设计模式模式观测(Observer Pattern)


    Observer Pattern 设计模式通常用于。这是一个事件侦听器模型。

    该模型有两个作用,一个是Subject, 有一个Observer。Subject 保存多个Observer参考,一旦一个特定的事件发生。Subject它会通知所有Observer。Observer得到该通知后运行相关程序逻辑。

    当中,Observer仅仅有先向Subject注冊后才干被Subject知晓。这就像订报纸,仅仅有我们向出版社提出订报的申请,出版社才会把我们列入订阅者名单。然后每当新报纸印好时,出版社会通知订阅者取报纸。这里订阅的用户就是 Observer, 出版社即 Subject。


    Subject , Observer的类图例如以下:



    以下通过一个实例来体会一下观察者模式。

    公司须要招聘人才时。往往会去找猎头(headhunter)。猎头知道非常多求职者(applicant)的联系方式。一旦有公司招人。猎头就会给这些求职者打电话,以通过他们有工作能够做了。

    在这里面,猎头就是 Subject,求职者就是 Observer。

    我们来实现这样一个功能。

    设计两个类,HeadHunter 和 Applicant。分别代表猎头和求职者。

    HeadHunter 类有一个属性 jobName。当jobName有新的值时(相当于公司要招人)。HeadHunter 就通知他所知道的全部 Applicant 告诉他们有工作了。

    类图例如以下:



    Subject 接口定义:

    public interface Subject {
    	void registerObjserver(Observer ob);
    	void removeObserver(Observer ob);
    	void notifyObservers();
    }

    Observer 接口定义:

    public interface Observer {
    	void update(Subject subject);
    }

    猎头类定义:

    public class HeadHunter implements Subject {
    	private List<Observer> obList = new ArrayList<Observer>();
    
    	private boolean isNotify = true;
    	private String jobName;
    
    	/**
    	 * 注冊一个Observer
    	 */
    	@Override
    	public void registerObjserver(Observer ob) {
    		obList.add(ob);
    	}
    
    	/**
    	 * 移除一个Observer
    	 */
    	@Override
    	public void removeObserver(Observer ob) {
    		obList.remove(ob);
    	}
    
    	/**
    	 * 通知全部的Observer
    	 */
    	@Override
    	public void notifyObservers() {
    		if (true == isNotify) {
    			performNotify();
    			isNotify = false;
    		}
    	}
    	
    	/**
    	 * 加入一个新的工作。

    加入完毕后立即通知全部Observer * @param jobName */ public void setJobName(String jobName) { this.jobName = jobName; isNotify = true; notifyObservers(); } private void performNotify() { for (Observer ob : obList) { ob.update(this); } } public String getJobName() { return jobName; } }


    求职者类定义:

    public class Applicant implements Observer {
    	private String name;
    	
    	public Applicant(String name) {
    		this.name = name;
    	}
    
    	@Override
    	public void update(Subject subject) {
    		HeadHunter h = (HeadHunter)subject;
    		out.println(name + "收到通知:" + h.getJobName());
    	}
    
    
    }


    这个小程序的功能是,一旦 HeadHunter 的 setJobName() 方法被调用(即有新工作),HeadHunter 立即通知它的 Applicant 告诉他们有工作了。程序測试代码例如以下:

    public static void main(String[] args) {
    		HeadHunter hh = new HeadHunter();
    		// 注冊observer
    		hh.registerObjserver(new Applicant("张三"));
    		hh.registerObjserver(new Applicant("李四"));
    		hh.registerObjserver(new Applicant("王五"));
    		
    		// 加入一个job
    		// 此时全部observer的update()方法都会被调用
    		hh.setJobName("Java程序猿");
    	}



    执行结果:



    Observer Pattern 在Swing中应用很广泛,比方调用 JButton 的 addListener() 加入一个事件监听器。此时 JButton 就是 Subject, Listener 就是 Observer。

    由于观察者模式比较频繁使用,因此,我们需要把握好经验。

    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    bbb SOCKET CAN
    在BBB上使用CCS5开发环境
    BBB的PRU模块
    垃圾邮件分类
    yzoj 2377 颂芬梭哈 题解
    yzoj 2372 小B的数字 题解
    yzoj P2371 爬山 题解
    hdu 1007 Quoit Design 题解
    手写堆
    yzoj P1126 塔 题解
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4802532.html
Copyright © 2020-2023  润新知