- 浏览: 440144 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (162)
- easymock (3)
- 模板引擎 (3)
- JForum (4)
- web (9)
- spring (10)
- java (20)
- struts (9)
- uml (3)
- java pattern (19)
- JQuery (14)
- 多线程 (13)
- database (21)
- PS (3)
- ejb (6)
- 版本管理 svn , maven , ant (2)
- protocol (1)
- 测试 (1)
- ws (7)
- Apache (4)
- 脚本语言 (1)
- guice (1)
- 分布式 (4)
- 架构 (0)
- 经验 (1)
- 版本管理 svn (1)
- maven (1)
- ant (1)
- 书籍 (1)
- Linux (1)
最新评论
-
Master-Gao:
稍微明白了点,,有点萌萌哒
为什么匿名内部类参数必须为final类型 -
waw0931:
终于明白了,谢谢!
为什么匿名内部类参数必须为final类型 -
十三圆桌骑士:
提供了两个链接还是有用的。
安装Mondrian -
放方芳:
[flash=200,200][/flash]
Freemarker标签使用 -
放方芳:
[b][/b]
Freemarker标签使用
Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically
uml图
观察者模式定义了一种一对多 的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己
观察者模式的组成
1.抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类或接口来实现
2.抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
3.具体主题角色(Watched):把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类或接口来实现。
4.具体观察者角色(Watcher):为所有具体的观察者定义一个接口,在得到主题的通知时更新自己
A.自定义观察者模式
例如:
1.抽象主题角色类
- package com.observe;
- public interface AbstractWatched {
- //增加一个观察者
- public void addAbstactWatcher(AbstractWatcher watcher);
- //移除一个观察者
- public void removeAbstactWatcher(AbstractWatcher watcher);
- //移除所有的观察着
- public void removeAll();
- //通知所有的观察者
- public void notifyWatchers();
- }
2.抽象观察者角色
3.具体主题角色(Watched)
- package com.observe;
- import java.util.ArrayList;
- import java.util.List;
- public class ConcreteWatched implements AbstractWatched {
- //list:存放观察者的一个集合对象
- List<AbstractWatcher> list = new ArrayList<AbstractWatcher>();
- //增加一个观察者
- public void addAbstactWatcher(AbstractWatcher watcher) {
- list.add(watcher);
- }
- //移除一个观察者
- public void removeAbstactWatcher(AbstractWatcher watcher) {
- list.remove(watcher);
- }
- //移除所有的观察着
- public void removeAll() {
- list.clear();
- }
- //通知所有的观察者
- public void notifyWatchers() {
- for (AbstractWatcher watcher : list){
- watcher.update();
- }
- }
- }
4.具体观察者角色(Watcher)
- package com.observe;
- public class ConcreteWatcher implements AbstractWatcher {
- //观察到被观察者发生变化时,执行的方法
- public void update() {
- System.out.println("update....." );
- }
- }
5.客户端调用:
- package com.observe;
- public class ClientTest {
- public static void main(String[] args){
- //定义一个被观察者对象
- AbstractWatched watched = new ConcreteWatched();
- //定义三个观察者对象
- AbstractWatcher watcher1 = new ConcreteWatcher();
- AbstractWatcher watcher2 = new ConcreteWatcher();
- AbstractWatcher watcher3 = new ConcreteWatcher();
- //被观察者添加观察者. 被观察者和观察者之间关系是一对多关系
- watched.addAbstactWatcher(watcher1);
- watched.addAbstactWatcher(watcher2);
- watched.addAbstactWatcher(watcher3);
- System.out.println("第1次..." );
- //被观察者发生改变时,通知观察者执行相应方法
- watched.notifyWatchers();
- //移除一个观察者
- watched.removeAbstactWatcher(watcher2);
- System.out.println("第2次..." );
- //被观察者发生改变时,通知观察者执行相应方法
- watched.notifyWatchers();
- //移除一个所有观察者
- watched.removeAll();
- System.out.println("第3次..." );
- //被观察者发生改变时,通知观察者执行相应方法
- watched.notifyWatchers();
- }
- }
执行结果为:
第1次...
update.....
update.....
update.....
第2次...
update.....
update.....
第3次...
B:对于java的观察者模式框架
从AWT1.1开始图形系统的事件模型采用观察者模式,因此观察者模式在Java语言中的地位极其重要
在xml解析中的SAX也采用了观察者模式来实现
Java也提供了对观察者模式的内置支持
内置观察者模式主要有2个类,一个是类Observable,一个是接口类Observer
Observable类是被观察者,子类只要继承它即可。而且添加观察者等方法已经都实现了.
Observer是观察者,只有一个接口方法public void update(Observable arg0, Object arg1),需要其子类来实现.这里,observOb是被观测的对象,而arg是由notifyObservers( )方法传递的值。当被观测对象发生了改变,调用update( )方法
1. 被观察者要继承Observable类
2. 被观察者通知观察者时,也就是调用notifyObservers方法时,一定要先调用setChanged()方法(该方法的作用就是将对象里面的changed这个boolean变量设定为true,因为 notifyObservers要首先检查该变量是否为true,如果为false就不执行而直接返回了)
3. Observable类的两个重载的notifyObservers方法,带参数的那个方法,里面的参数就是Observer接口中的update方法中的第二个参数
一个被观测的对象必须服从下面的两个简单规则。第一,如果它被改变了,它必须调用 setChanged( )方法。第二,当它准备通知观测程序它的改变时,它必须调用notifyObservers( )方法。这导致了在观测对象中对update( )方法的调用。注意——当对象在调用notifyObservers( )方法之前,没有调用setChanged( )方法,就不会有什么动作发生。在update( )被调用之前,被观测对象必须调用setChanged( )和notifyObservers( )两种方法
例如:
被观察者:
- package com.observe2;
- import java.util.Observable;
- public class Watched extends Observable{
- public void count( int number){
- for ( ; number >= 0 ; number-- ){
- setChanged();
- // 注意notifyObservers()有两种形式:一种带有参数而另一种没有。当用参数调用notifyObservers( )方法时,该对象被传给观测程序的update( )方法作为其第二个参数。否则,将给update( )方法传递一个null。可以使用第二个参数传递适合于你的应用程序的任何类型的对象。
- //也就是说notifyObservers()内部实际调用的是notifyObservers(null);
- notifyObservers(number);
- }
- }
- }
第一个观察者
- package com.observe2;
- import java.util.Observable;
- import java.util.Observer;
- public class Watcher implements Observer{
- public void update(Observable arg0, Object arg1) {
- System.out.println((Integer)arg1);
- }
- }
第二个观察者:
- package com.observe2;
- import java.util.Observable;
- import java.util.Observer;
- public class Watcher2 implements Observer{
- public void update(Observable arg0, Object arg1) {
- if ((Integer)arg1 == 0 ){
- System.out.println("done" );
- }
- }
- }
客户端调用:
- package com.observe2;
- public class Client {
- public static void main(String[] args){
- //定义一个被观察者
- Watched watched = new Watched();
- //定义2个观察者
- Watcher watcher = new Watcher();
- Watcher2 watcher2 = new Watcher2();
- //给被观察者添加观察者
- watched.addObserver(watcher);
- watched.addObserver(watcher2);
- watched.count(10 );
- }
- }
输出结果为:
10
9
8
7
6
5
4
3
2
1
done
0
发表评论
-
访问者模式 Visitor(转)
2012-06-25 14:49 1173一、引子 对于系统中一个已经完成的类层次结构,我们已 ... -
策略模式 Strategy
2012-06-21 10:30 989策略模式(Strategy):它定义了一系列的算法,并将每一个 ... -
模板方法模式 Template Method
2012-06-21 10:21 889GOF给模板方法(Template Method)模式定义一个 ... -
状态模式 State
2012-06-19 15:37 1023State模式的定义: 不同的 ... -
备忘录模式 Memento(转)
2012-06-19 14:11 0备忘录模式(Memento) 属于对象的行为模式。 ... -
中介者模式 Mediator (转)
2012-06-19 11:11 0一、中介者模式简介 ... -
迭代器模式 iterator
2012-06-18 14:58 3274一、 引言 迭代这个名词对于熟悉Java的人来说绝对不陌 ... -
解释器模式 interpreter(转)
2012-06-18 13:48 0Interpreter模式也叫解释器模式,是由GoF提出的23 ... -
责任链模式 chain of responsibility(原)
2012-06-15 15:56 1038动机: 在开发过程中有一种情况:一个事件产生一个请求,这个请 ... -
享元模式 flyweight
2012-06-14 15:45 909个人理解:当系统内部需要使用大量的细粒度对象时,内存中每种类型 ... -
外观模式 Facade
2012-06-13 16:02 937先做个总结: 外观模式就是提供一个高层接口来集成、制定、调用 ... -
组合模式(Composite)
2012-06-13 15:33 2197The figure below shows a UML cl ... -
适配器模式(Adapter )
2012-06-13 14:46 949Adapter - Convert the interfac ... -
Bridge桥接模式
2012-06-08 15:24 758Bridge桥接模式是一种结构型模式,它主要应对的是:由于类 ... -
代理模式
2012-06-08 11:06 779代理模式:给某一对象提供代理对象,并由代理对象控制具体对象的引 ... -
设计模式(Design Pattern)的原则
2012-06-08 11:00 836设计模式(Design Pattern)的原则 1、&q ... -
原型模式 Prototype Pattern
2012-03-30 18:34 1147一. 原型模式简介 ... -
设计模式之Decorator
2012-03-30 16:44 793设计模式之Decorator(油漆工) ... -
命令模式
2011-12-09 15:35 787优点: 解耦了发送者和接受者之间联系。 发送者调用一个 ... -
抽象工厂 理解
2011-10-14 18:22 982抽象工厂模式 抽象工厂模式(英语:Abstra ...
相关推荐
Qt设计模式之观察者模式
采用Java语言编写的一个观察者模式实例。观察者模式(有时又被称为模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,...
java观察者模式观察者模式java观察者模式观察者模式java观察者模式观察者模式
观察者模式及实例,适合初学者阅读 。。。。。。。。。。。。。。。
观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件...
Java 观察者模式的浅析 简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者...
观察者模式
java 设计模式 观察者模式 简单实例 包括测试test类
观察者模式:对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer变化,这个例子是java内置观察者模式
设计模式之观察者模式Java版本实现和UML类设计图
设计模式-观察者模式(讲解及其实现代码)
设计模式--观察者模式java例子
运用观察者模式及MVC模式的整合,是javaWeb的简单的实现了选民投票
观察者模式Demo,设计模式,观察者模式
观察者模式使用
iOS 设计模式 观察者模式
观察者模式小型框架
56丨观察者模式(上):详解各种应用场景下观察者模式的不同实现方式1
面向对象23种设计模式之观察者模式,简单明了。面向对象23种设计模式之观察者模式,简单明了。