Design Pattern_Observer(观察者模式)
来源:互联网 发布:fifaol3数据库电脑版 编辑:程序博客网 时间:2024/05/18 01:24
Observer模式意图:在对象之间定义一种一对多的依赖关系,这样当一个对象的状态改变时,所有依赖与它的对象都将得到通知并自动更新。问题:当某个事件发生时,你需要向一系列对象发出通知,而这个对象的列表是不断变化的。解决方案:Observer将监视某个事件的责任委托给一个中心对象:Subject。参与者和协作者:Subject知道自己的Observer,因为Observer在Subject上注册自己。当关心的事件发生时,Subject必须通知Observer。Observer有责任在得到通知时从Subject处获取更多信息。效果:如果某些Observer只对全部事件的一个子集感兴趣,那么Subject可能会告诉Observer它们不需要知道的事件。如果在Subject通知Observer之后,Observer又转过来请求附加信息,就可能需要额外的通信。实现: 1.让“希望知道哦阿某个事件何时发生”的对象(Observer)将自己注册到另一个“监视事件发生或自己触发事件”的对象(Subject)上。 2.当事件发生时,Subject告诉Observer“你关心的事件已经发生了”。 3.为了能让所有的观察者型兑现实现Observer接口,有时候需要使用Adapter模式。
流程如下:
1.创建Concrete Subject,
2.Observer 注册到Subject中
3.改变Subject属性,Subject.Notify
4.Subject 告诉 Observer 自己被改变了,至于具体是那个数据改变了不用知道
5.Observer自己去Subject中取感兴趣的数据
在4.5步其实要注意一点就是为什么没有让Subject直接把Observer 感兴趣的数据给它,而是让Observer自己来取!
这其实就是对“责任”的一种处理,好的OOPL其实就是对责任的一种划分,
比如老师要通知学生上课,有两种方法
一。把学生具体的路径给它们,告诉它们要从那走,走多远,怎么转向...(选路径责任在老师)
二。老师告诉同学在那个教室上课,同学们自己来确定路线。(路径选择责任在学生)
很明显第二种方法简单实用的多,而且更灵活,想想如果多了一个同学,老师就要特地的为这个同学制定路线,无形中代码就多了
其实这有点类似于设计数据库,外键的方向一定要设计好一样!
在这种情况下可以假设当某一方的数量增加时,代码应该如何改,如果代码不断增加而且越来越不可控制,那就是一个错误的设计!
在这里我举一个项目中的例子
import java.util.HashSet;import java.util.Iterator;import java.util.Set;/** * 这是项目里的一个例子 * 需求是实现一个聊天功能,比如用户名被改变,当远程的数据推送过来到UserDB后,UserDB要负责告诉每个列表来取数据更新 * @author blacklaw * */public class test {public static void main(String[] args){System.out.println("Go");//创建实体和观察者UserDB userDB = new UserDB();FriendList friendL = new FriendList(userDB);userDB.attach(friendL);FriendList friendL2 = new FriendList(userDB);userDB.attach(friendL2);//修改数据userDB.addUser("blacklaw");//实体负责通知到对象userDB.notifys();}}//Concrete Subjectclass UserDB{Set<UserList> userLists = new HashSet<UserList>();public String user;//Observer Interfaceinterface UserList{public void upadta();}public void addUser(String username){user = username;}public void attach(UserList o){userLists.add(o);}public void detach(UserList o){userLists.remove(o);}public void notifys(){Iterator it = userLists.iterator();while(it.hasNext()){((UserList)it.next()).upadta();}}}//Concrete Observerclass FriendList implements UserDB.UserList{UserDB userDB;FriendList(UserDB db){userDB = db;}@Overridepublic void upadta() {// TODO Auto-generated method stubSystem.out.println("new user is " + userDB.user);}}
- Design Pattern_Observer(观察者模式)
- Design Pattern:观察者模式
- Design pattern--观察者模式
- Design Pattern 之 观察者模式
- Design Pattern 之 观察者模式
- HeadFirst design pattern笔记-观察者模式
- Java Design Pattern Observer 观察者模式
- Design Pattern - Observer 观察者设计模式
- Design Pattern(设计模式- 行为模式)-------Observer(观察者)
- Java设计模式 Design Pattern:观察者模式 Observer Pattern
- 设计模式 Design Parttern ——观察者模式Observer
- 设计模式之 观察者模式 the observer design pattern
- 设计模式之-观察者模式(Observer Design Pattern)
- 设计模式之观察者模式 (Observer Design Pattern)
- 设计模式学习—观察者模式(Observer Design Pattern)
- 观察者模式——Head First Design Patterns
- Design Pattern—— Observer Pattern 观察者模式
- 《Head First Design Patterns》读书笔记之观察者模式
- myesclipse配置hibernate
- 大流量数据异步输出
- 虚拟机上安装的Linux从Windows本机提取文件的几种方式及注意事项
- GB28181 SIP视频监控系列之 设备信息查询
- Tcl-debug install guid
- Design Pattern_Observer(观察者模式)
- LocalActivityManager
- 30岁之前需要知道的10个人生底线,你知道几个?
- MyEclipse安装Ext JS和jQuery自动提示功能
- 搬到新家了。。
- uva 10054 - The Necklace
- 海量jQuery插件
- GB28181 SIP视频监控标准之 历史文件检索
- HDOJ 3033 I love sneakers! (分组背包)