设计模式学习二:观察者模式

一.概念

     在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。

     观察者模式也被称之为:主题-观察者模式,发布-订阅模式,前者是一,后者是多。

二.UML

  1. Subject(主题类),最主要的方法:添加/删除观察者,改变状态,通知观察者。
  2. Observer(观察者类),当主题状态改变,通知观察者时,触发观察者的update方法。

三.实例分析

     《那些年,我们一起追的女孩》让我回到了高中,想到了以前的同桌,那个我暗恋N久的女孩子。那时候,我们一起下课,一起吃饭,一起逃课,一起翻 墙...往事啊,泪奔 ...好了,回归正题,再说要被大家喷了。我跟她是一个班,我们是一个班主任,班主任不在,我们可以嘻嘻哈哈玩玩耍耍,班主任来了,我们还是得收敛点。

     对比一下概念:班主任是一,我和她是多,我们依赖班主任,班主任状态改变了(不在教室变成了在教室),我们就要做点改变了。

     Teacher

package com.zzy.observer;

import java.util.Observable;
/**
 * 主题
 * @author eason
 *
 */
public class Teacher extends Observable{
	public void setChanged() {
		super.setChanged();
	}
}

Student

package com.zzy.observer;

import java.util.Observable;
import java.util.Observer;

/**
 * 观察者
 * @author eason
 *
 */
public class Student implements Observer{

	private String name;
	private String action;
	
	public Student(String name, String action) {
		this.name = name;
		this.action =action;
	}
	
	@Override
	public void update(Observable o, Object arg) {
		System.out.println(this);
	}
	
	@Override
	public String toString() {
		return "学生" + name + action;
	}
}

TestObserver

package com.zzy.observer;

/**
 * 测试类
 * @author eason
 *
 */
public class TestObserver {
	public static void main(String[] args) {
		//班主任
		Teacher teacher = new Teacher();
		//我和她
		Student stu1 = new Student("eason", "收起手机");
		Student stu2 = new Student("grace", "停止睡觉");
		//我跟她所属的班主任
		teacher.addObserver(stu1);
		teacher.addObserver(stu2);
		//老师来了
		teacher.setChanged();
		teacher.notifyObservers();
	}
}

     java.util.Observable和java.util.Observer比较简单,有兴趣大家自己去研究下。

四.使用场景

  1. 当一个对象的改变会引起其他对象的改变,这个时候,考虑观察者模式。比喻java.util.Swing中的事件监听。

五.使用感受

  1. java.util.Observable内部用一个Vector实现。学习的过程中,自己写一个Observable收获颇多。
  2. 松耦合,主题不知道观察者的具体细节(update方法的具体实现),只要你实现了观察者接口就行。
  3. 主题向观察者推数据。

猜你喜欢

转载自zy19982004.iteye.com/blog/1407252