- 浏览: 830709 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (379)
- struts (5)
- hibernate (16)
- spring (16)
- ssh (20)
- MySQL (16)
- 数据库脚本 (2)
- DownLoad (1)
- GAE (5)
- Java (103)
- LoadRunner (2)
- VF (1)
- 学习资料 (24)
- 软件使用 (21)
- 通信类 (4)
- 生活 (3)
- J2ME (1)
- 心理学 (1)
- Linux (26)
- Android (3)
- Oracle (1)
- 面向对象概念&面试准备 (11)
- ExtJs (2)
- Google Map (1)
- Flex (47)
- 算法研究 (1)
- share (20)
- python (1)
- MongoDB (7)
- centos6 (13)
- C++ (8)
- DB2 (3)
- C# (1)
- 代码片段 (24)
- Lucene (2)
- php (1)
- NodeJS (1)
- Express (1)
最新评论
-
shua1991:
已阅,我表示同意。
Eclipse统计代码行数 -
nakedou:
写的不错,挺详细的
在CentOS中使用 yum 安装MongoDB及服务器端配置 -
sjp524617477:
好方法
Eclipse统计代码行数 -
simpletrc:
<script>ale ...
Java写到.txt文件,如何实现换行 -
csdn_zuoqiang:
Apache Ftp Server,目前是1.0.4,非常好的 ...
Apache FtpServer在64位系统下服务不能启动解决方法
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化的时,会通知所有观察者对象,使他们能够自动更新自己。 当一个对象的改变需要同时改变其他对象的时候,而且不知道有多少对象有待改变时,应该考虑使用观察者模式。 观察者模式所做的工作其实就是解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使的各自的变化都不会影响另一边的变化。
Subject类:它把所有对观察者对象的引用保存在一个聚集里面,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。 public void Notify() { for(Observer o:observers) { o.Update(); } ConcreteSubject类: 具体的主题,将有关状态存入具体观察者对象,在具体主题的内部状态改变时,给所有登记国的观察者发出通知。 Observer接口:抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己 ConcreteObserver:具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调
一、观察者模式简介(Brief Introduction)
二、解决的问题(What To Solve)
三、观察者模式分析(Analysis)
package observer; import java.util.ArrayList; import java.util.List; /** ************************************* * @Title Subject.java * @Author 张作强 * @Date 2010-8-22 * @Comment Subject类,主题或者抽象通知者 ************************************* */ public abstract class Subject{ private List<Observer> observers = new ArrayList<Observer>(); // 添加一个观察者 public void Attach(Observer observer){ this.observers.add(observer); } // 移除一个观察者 public void Detach(Observer observer){ this.observers.remove(observer); } // 通知每一个观察者 public void Notify(){ for(Observer o : this.observers){ o.Update(); } } }
package observer; /** ************************************* * @Title ConcreteSubject.java * @Author 张作强 * @Date 2010-8-22 * @Comment ConcreteSubject类,具体主题或者具体通知者 ************************************* */ public class ConcreteSubject extends Subject { private String subjectState; public String getSubjectState() { return this.subjectState; } public void setSubjectState(String subjectState) { this.subjectState = subjectState; } }
package observer; public interface Observer { public void Update(); }
package observer; public class ConcreteObserver implements Observer { private String name; private String observerState; private ConcreteSubject subject; public String getObserverState() { return observerState; } public void setObserverState(String observerState) { this.observerState = observerState; } public ConcreteObserver(ConcreteSubject subject,String name){ this.subject = subject; this.name = name; } public void Update() { observerState = subject.getSubjectState(); System.out.println("观察者 " + name +" 的新状态是 " + observerState); } }
package observer; public class Test { public static void main(String[] args) { ConcreteSubject cs = new ConcreteSubject(); Observer observer1 = new ConcreteObserver(cs, "张作强"); Observer observer2 = new ConcreteObserver(cs, "陈惠仪"); cs.Attach(observer1); cs.Attach(observer2); cs.setSubjectState("OK"); cs.Notify(); } }
结果:
观察者 张作强 的新状态是 OK
观察者 陈惠仪 的新状态是 OK
观察者模式的优点:
1.在被观察者和观察者之间建立一个抽象的松耦合;
2.支持广播通信。被观察者会向所有登记过的观察者发出通知。
观察者模式也有如下缺点:
1.如果一个被观察者对象有很多直接或间接的观察者的话,将所有的观察者都通知到会花费很多时间;
2.如果在被观察者之间有循环依赖的话,被观察者会触发它们进行循环调用,导致系统崩溃,在使用此模式时应特别注意这一点;
3.如果对观察者的通知是通过另外的线程进行异步投递的话,系统必须保证投递是以自恰的方式进行的;
4.虽然观察者模式可以使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制让观察者知道所观察的对象是怎么发生变化的。
发表评论
-
微信JS
2013-10-26 21:17 2039<div class="iteye-blog- ... -
ubuntu下MySQL用source命令导入sql文件出现乱码解决方法
2012-11-18 23:46 1482首先建立数据库的时候指明数据库编码如: CREA ... -
RandomAccessFile
2012-10-18 18:16 940public void run() { try { ... -
java中多种方式读文件
2012-10-18 16:53 922java中多种方式读文件一、多种方式读文件内容。1、按字节读取 ... -
FileChannelMain
2012-10-15 18:12 1071package scan; import java ... -
Apache FtpServer在64位系统下服务不能启动解决方法
2012-06-10 21:29 6799Apache FTPServer是一款用Java开发的 ... -
Java 集合类
2012-06-07 22:03 1562Java 集合类 1. 为什么要了解J ... -
short、int、long与byte之间的转换工具类
2012-05-31 11:05 4475/** * 各基础类型与byte之间的转换 * ... -
Linux Mint 13 配置JAVA 环境
2012-05-24 22:35 26180.1--下载 JAVA ... -
FatJar+Exe4j+Inno Setup 生成可执行的exe文件
2012-04-17 10:54 14241、fatjar 是Eclipse的一个免费的插件。它的 ... -
JPanel JTextField add Focus 获取焦点解决方案
2012-03-30 21:29 2978public class TabPagePanel ex ... -
JList List<E> Page 分页
2012-03-30 21:28 1729package view.retrieve.comps. ... -
JButton setAction的BUG
2012-03-23 10:53 1275今天在使用JButton的时候,想用setText()setI ... -
自定义JTabbedPane皮肤
2012-03-22 12:05 4708package ui; import java.awt. ... -
两个工具类
2012-03-17 21:27 862package com.retrieve.utils; ... -
两个工具类
2012-03-17 21:27 0package com.retrieve.utils; ... -
mysql、sqlserver、oracle分页,java分页统一接口实现
2012-03-13 17:56 0定义: pageStart 起始页,pageEnd 终止页, ... -
Invalid command: InetLoad::load
2012-03-06 16:41 1282Invalid command: InetLoad::load ... -
NIO: High Performance File Copying
2012-03-01 17:25 1148In a previous tip, I discussed ... -
自定义JList
2012-02-03 15:39 772自定义JList。
相关推荐
observer观察者模式
C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)
C#面向对象设计模式 (行为型模式) Observer 观察者模式 视频讲座下载
观察者模式 概述 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 适用性 1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面。 将这二者封装...
通过事例和代码,详细介绍了Observer模式在android中的应用
NULL 博文链接:https://lgh3292.iteye.com/blog/600905
定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
主要介绍了C#设计模式之Observer观察者模式解决牛顿童鞋成绩问题,简单讲述了观察者模式的原理并结合具体实例形式分析了使用观察者模式解决牛顿童鞋成绩问题的具体步骤相关操作技巧,并附带demo源码供读者下载参考,...
设计模式C++学习之观察者模式(Observer)
Observer(观察者模式)学习源码,该源码讲述并Observer(观察者模式)一些具体实现过程
我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--...
观察者模式通常的叫法叫做订阅-发布模式,类似于报刊杂志的订阅,观察者和被观察者就是读者和邮局的关系,读者先要在邮局订阅想要的报刊,当报刊发行时,邮局会将报刊邮寄到读者家里。观察者(Observer)和被观察者...
观察者模式(Observer) 用意:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。
观察者模式示例 观察者模式示例 观察者模式示例 观察者模式示例 观察者模式示例 观察者模式示例
观察者模式Observer: 以手机号码为例,老师的手机号码存在学生的手机里,若老师的手机号改变,她会发一条短信通知每个学生自己手机号变了