关闭

设计模式-观察者模式

标签: 设计模式annotationsclassseaminterfacerandom
483人阅读 评论(0) 收藏 举报
分类:
最近用seam框架,发现所有的event都可以通过定义观察者去观察,很好很强大,遂有感研究下设计模式中的观察者模式。

GoF说道:Observer模式的意图是“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”。
怎么理解呢,简单起见,以家长和老师对学生考试成绩的观察为例。

先定义一个通用观察者接口:

package com.db.observer;
public interface ObserverInterface {
	public abstract void update(Student stu);
}

再定义一个学生类:
package com.db.observer;

import java.util.Iterator;
import java.util.Random;

public class Student {
	
	private int score;
	
	public void changeScore(){
		score = (new Random()).nextInt(100);
		notifyObserver();
	}

	public int getScore() {
		return score;
	}
	
	private void notifyObserver(){
		if(ObserverGen.oi!=null && !ObserverGen.oi.isEmpty()){
			Iterator<ObserverInterface> e = ObserverGen.oi.iterator();
			while(e.hasNext()){
				e.next().update(this);
			}
		}
	}
}

再定义两个观察者:一个是家长,一个老师
package com.db.observer;

public class ParentOberver implements ObserverInterface{
	
	@Override
	public void update(Student stu) {
		if(stu.getScore()>80){
			System.out.println("Score="+stu.getScore()+",Parent:^_^");
		}else{
			System.out.println("Score="+stu.getScore()+",Parent:>_<");
		}
	}

}

package com.db.observer;

public class TeacherObserver implements ObserverInterface {

	@Override
	public void update(Student stu) {
		if(stu.getScore()>80){
			System.out.println("Score="+stu.getScore()+",Teacher:You're brilliant!");
		}else{
			System.out.println("Score="+stu.getScore()+",Teacher:Don't be a chicken!");
		}
	}
}

为了以后可以很方便地添加其他的观察者(比如亲戚,同学,女友等等),应该定义一个观察者注册器:
package com.db.observer;

import java.util.ArrayList;
import java.util.List;

public class ObserverGen {
	public static List<ObserverInterface> oi = new ArrayList<ObserverInterface>();
}
下面看测试代码:
package com.db.observer;
public class TestObserver {
	public static void main(String[] args) {
		ObserverInterface pob = new ParentOberver();
		ObserverInterface tob = new TeacherObserver();
		
		ObserverGen.oi.add(pob);
		ObserverGen.oi.add(tob);
		
		(new Student()).changeScore();
	}
}

某次运行结果:
Score=99,Parent:^_^
Score=99,Teacher:You're brilliant!


我们可以看到,当学生的成绩发生变化时,所依赖的对象(家长和老师)都及时得到了通知并自动更新了状态。
题外话:Seam框架里定义了很多有用的观察者事件,通过annotations使用起来,非常灵活,这种设计思想很值得我们去借鉴。


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:200825次
    • 积分:2264
    • 等级:
    • 排名:第16652名
    • 原创:42篇
    • 转载:22篇
    • 译文:0篇
    • 评论:50条
    文章分类
    最新评论