- 浏览: 451552 次
- 性别:
- 来自: 杭州
-
文章分类
- 全部博客 (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 1222一、引子 对于系统中一个已经完成的类层次结构,我们已 ... -
策略模式 Strategy
2012-06-21 10:30 1036策略模式(Strategy):它定义了一系列的算法,并将每一个 ... -
模板方法模式 Template Method
2012-06-21 10:21 951GOF给模板方法(Template Method)模式定义一个 ... -
状态模式 State
2012-06-19 15:37 1092State模式的定义: 不同的 ... -
备忘录模式 Memento(转)
2012-06-19 14:11 0备忘录模式(Memento) 属于对象的行为模式。 ... -
中介者模式 Mediator (转)
2012-06-19 11:11 0一、中介者模式简介 ... -
迭代器模式 iterator
2012-06-18 14:58 3318一、 引言 迭代这个名词对于熟悉Java的人来说绝对不陌 ... -
解释器模式 interpreter(转)
2012-06-18 13:48 0Interpreter模式也叫解释器模式,是由GoF提出的23 ... -
责任链模式 chain of responsibility(原)
2012-06-15 15:56 1079动机: 在开发过程中有一种情况:一个事件产生一个请求,这个请 ... -
享元模式 flyweight
2012-06-14 15:45 949个人理解:当系统内部需要使用大量的细粒度对象时,内存中每种类型 ... -
外观模式 Facade
2012-06-13 16:02 986先做个总结: 外观模式就是提供一个高层接口来集成、制定、调用 ... -
组合模式(Composite)
2012-06-13 15:33 2241The figure below shows a UML cl ... -
适配器模式(Adapter )
2012-06-13 14:46 1003Adapter - Convert the interfac ... -
Bridge桥接模式
2012-06-08 15:24 829Bridge桥接模式是一种结构型模式,它主要应对的是:由于类 ... -
代理模式
2012-06-08 11:06 835代理模式:给某一对象提供代理对象,并由代理对象控制具体对象的引 ... -
设计模式(Design Pattern)的原则
2012-06-08 11:00 891设计模式(Design Pattern)的原则 1、&q ... -
原型模式 Prototype Pattern
2012-03-30 18:34 1198一. 原型模式简介 ... -
设计模式之Decorator
2012-03-30 16:44 845设计模式之Decorator(油漆工) ... -
命令模式
2011-12-09 15:35 836优点: 解耦了发送者和接受者之间联系。 发送者调用一个 ... -
抽象工厂 理解
2011-10-14 18:22 1037抽象工厂模式 抽象工厂模式(英语:Abstra ...
相关推荐
观察者模式,是一种广泛应用在软件设计中的对象行为型模式,其核心思想是让一个对象能够在其状态发生变化时,自动通知所有对其感兴趣的其他对象。这种模式促进了"发布-订阅"概念的实现,允许对象间的解耦,提高代码...
要通知到需要了解该变化的类,Windows编程中经常用到的是发消息,要是没有Windows的消息机制的话,自己做一套消息机制倒是可以,但也是徒增了工作量,再次想到了设计模式中的观察者模式,也可以实现这个想法,具体...
观察者模式,也被称为发布-订阅(Publish-Subscribe)模式,是软件设计中的一种行为模式。在iOS开发中,它是一种让多个对象监听或订阅某一个主题对象的状态变化,并在状态变化时自动收到通知的方式。这种模式使得...
观察者模式是软件设计模式中的一种行为模式,它允许一个对象(称为主题或可观察者)在状态发生改变时通知其他对象(称为观察者)。这种模式遵循了几个重要的设计原则,如开放封闭原则、依赖倒置原则和组合复用原则,...
观察者模式是一种软件设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在处理事件驱动和实时信息更新的系统中非常常见,如股票市场的...
观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式在软件开发中广泛应用,特别是在事件驱动编程和异步处理中。C#...
### 观察者模式框架详解 #### 一、观察者模式概述 观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象间的一种一对多依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并...
观察者模式是软件设计模式中的一种行为模式,它在对象之间定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件处理、发布订阅系统、消息...
C++观察者模式距离说明 在软件设计中,观察者模式是一种常见的设计模式,它允许对象之间彼此通信,并在其中一个对象的状态发生变化时,自动通知其他对象。这种模式广泛应用于各种软件系统中,如社交媒体、消息推送...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动编程或者...
观察者模式是一种软件设计模式,它定义了对象间的一种一对多的依赖关系,使得每当一个对象状态发生改变时,所有依赖于它的对象都会得到通知,并自动更新。在Angular框架中,观察者模式是一种非常常见的实现方式,...
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在C#中,这种模式经常用于事件处理,使得对象之间可以松散耦合地交互。下面...
观察者模式(Observer Pattern)是设计模式中的一种行为模式,属于事件驱动模型,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这一模式的核心在于...