设计模式-观察者模式
来源:互联网 发布:com域名注册最便宜 编辑:程序博客网 时间:2024/04/30 17:59
最近用seam框架,发现所有的event都可以通过定义观察者去观察,很好很强大,遂有感研究下设计模式中的观察者模式。
GoF说道:Observer模式的意图是“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”。
怎么理解呢,简单起见,以家长和老师对学生考试成绩的观察为例。
再定义一个学生类:
再定义两个观察者:一个是家长,一个老师
为了以后可以很方便地添加其他的观察者(比如亲戚,同学,女友等等),应该定义一个观察者注册器:
我们可以看到,当学生的成绩发生变化时,所依赖的对象(家长和老师)都及时得到了通知并自动更新了状态。
题外话:Seam框架里定义了很多有用的观察者事件,通过annotations使用起来,非常灵活,这种设计思想很值得我们去借鉴。
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{@Overridepublic 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 {@Overridepublic 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使用起来,非常灵活,这种设计思想很值得我们去借鉴。
- 模式设计:观察者模式
- 设计模式-----观察者模式
- 设计模式-观察者模式
- 设计模式--观察者模式
- 设计模式:观察者模式
- 设计模式-----观察者模式
- 设计模式:观察者模式
- 设计模式-观察者模式
- 设计模式 观察者模式
- 设计模式-观察者模式
- 设计模式-【观察者模式】
- 设计模式-观察者模式
- 设计模式 -- 观察者模式
- 设计模式-观察者模式
- 【设计模式】观察者模式
- 设计模式- 观察者模式
- 设计模式- 观察者模式
- 设计模式--观察者模式
- DM6437中的PSP库介绍
- 重要连接
- [内存管理]内存池pool库
- (转)FLV格式解析
- osmf cuepoint
- 设计模式-观察者模式
- (转)SWF文件格式解析
- MD5加密算法
- RTCP协议
- HubbleDotNet 简介 分词技术
- arm 裸机程序
- java serializable深入了解
- (转)关于SWF文件的格式分析
- 怎样在 Cocos2d里面使用 UITapGestureRecognizer来处理单击和双击