Java观察者模式的浅析

简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。

在观察者模式里有如下的角色:

抽象主题(Subject)角色:

主题角色把所有的观察者对象的引用保存在一个列表里;每个主题都可以有任何数量的观察者。主题提供一个接口可以加上或撤销观察者对象;主题角色又叫做抽象被观察者(Observable)角色;

抽象观察者(Observer)角色:

为所有的具体观察者定义一个接口,在得到通知时更新自己;

具体主题(ConcreteSubject)角色:

保存对具体观察者对象有用的内部状态;在这种内部状态改变时给其观察者发出一个通知;具体主题角色又叫作具体被观察者角色

具体观察者(ConcreteObserver)角色:

保存一个指向具体主题对象的引用;和一个与主题的状态相符的状态。具体观察者角色实现抽象观察者角色所要求的更新自己的接口,以便使本身的状态与主题的状态自恰。

继承关系(此实例简化了abstract subject类):

代码实现:

(1)创建Subject类

package study_02.designpattern.observer;

import java.util.ArrayList;
import java.util.List;
/**
* Create <strong>Subject</strong> class.
* @author WWX
*
*/
public class Subject { private List<Observer> observers
= new ArrayList<Observer>();
private int state; public int getState() {
return state;
} public void setState(int state) {
this.state = state;
notifyAllObservers();
} public void attach(Observer observer){
observers.add(observer);
} public void notifyAllObservers(){
for (Observer observer : observers) {
observer.update();
}
}
}

(2)创建Oberver抽象类或接口

package study_02.designpattern.observer;
/**
* Create <strong>Observer</strong> class
* @author WWX
*
*/
public abstract class Observer {
protected Subject subject; public abstract void update();
}

(3)创建继承了Oberver接口Concrete Oberver类

package study_02.designpattern.observer;
/**
* Create <strong>concrete observer</strong> classes
* @author WWX
*
*/
public class BinaryObserver extends Observer { public BinaryObserver(Subject subject) {
this.subject = subject;
this.subject.attach(this);
} @Override
public void update() {
System.out.println("Binary String: "
+ Integer.toBinaryString(subject.getState()));
}
}
package study_02.designpattern.observer;
/**
* Create <strong>concrete observer</strong> classes
* @author WWX
*/
public class HexaObserver extends Observer { public HexaObserver(Subject subject) {
this.subject = subject;
this.subject.attach(this);
} @Override
public void update() {
System.out.println("Hex String: "
+ Integer.toHexString(subject.getState()).toUpperCase());
}
}
package study_02.designpattern.observer;
/**
* Create <strong>concrete observer</strong> classes
* @author WWX
*/
public class OctalObserver extends Observer { public OctalObserver(Subject subject) {
this.subject = subject;
this.subject.attach(this);
} @Override
public void update() {
System.out.println("Octal String: "
+ Integer.toOctalString(subject.getState()));
}
}

(4)使用Subject和Concrete Oberver对象

package study_02.designpattern.observer;
/**
*
* @author WWX
*/
public class ObserverPatternDemo {
public static void main(String[] args) {
Subject subject = new Subject(); new HexaObserver(subject);
new OctalObserver(subject);
new BinaryObserver(subject); System.out.println("First state change: 15");
subject.setState(15);
System.out.println("Second state change: 10");
subject.setState(10);
}
}

java设计模式之观察者模式(9)的更多相关文章

  1. 理解java设计模式之观察者模式

    在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的“观察者模式”,它适 ...

  2. java设计模式之观察者模式以及在java中作用

    观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependen ...

  3. java设计模式02观察者模式

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 这里主要讲一下学习内置观察者的记录,在JA ...

  4. java设计模式之观察者模式

    观察者模式 观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式.模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.在此种模 ...

  5. JAVA设计模式 之 观察者模式

    简介: 观察者模式是JDK中最多的设计模式之一,非常有用,观察者模式介绍了一对多的依赖关系及松耦合,有了观察者,你将会消息灵通. 认识观察者模式,看一个报纸.杂志订阅是怎么回事: (1). 报社的业务 ...

  6. 折腾Java设计模式之观察者模式

    观察者模式 Define a one-to-many dependency between objects where a state change in one object results in ...

  7. JAVA设计模式之观察者模式 - Observer

    有趣的事情发生时,可千万别错过了!有一个模式可以帮你的对象知悉现况,不会错过该对象感兴趣的事.对象甚至在运行时可决定是否要继续被通知.有了观察者,你将会消息灵通. 介绍 观察者模式的定义: 在对象之间 ...

  8. JAVA设计模式 之 观察者模式(JDK内置实现)

    简介:使用JAVA内置的帮你搞定观察者模式. 1. 先把类图放在这里: (1). Observable类追踪所有的观察者,并通知他们. (2). Observer这个接口看起来很熟悉,它和我们之前写的 ...

  9. java设计模式:观察者模式

    package Observer; public class Test { /** * client测试类别 * 观察者模式一般由四部分组成: * 1摘要观察员(教科书被称为一般"Subje ...

随机推荐

  1. boost::thread用法

    最近在做一个消息中间件里面涉及到多线程编程,由于跨平台的原因我采用了boost线程库.在创建线程时遇到了几种线程创建方式现总结如下: 首先看看boost::thread的构造函数吧,boost::th ...

  2. N皇后( DFS,推荐)

    N皇后问题 Description   在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.          你的任 ...

  3. BestCoder Round #50 (div.1) 1001 Distribution money (HDU OJ 5364)

    题目:Click here 题意:bestcoder上面有中文题目 #include <iostream> #include <cstdio> #include <cst ...

  4. 翻页采用jaxa

    <!-- 翻页采用jaxa --><script type="text/javascript">//class="page"下面的a被点 ...

  5. python几个排序函数 sort sorted argsort

    Python中排序常用到的sort .sorted和argsort函数 [摘要:Python中sort 战 sorted函数 一 .先容 sort函数是list列表中的函数,而 sorted能够对li ...

  6. Cesium 获取当前视图范围

    Cesium作为一个开源的WebGlobe解决方案已经很牛了,不过因为开发的资料不多,很多功能不知道怎么实现.下面记录下自己获取Cesium当前场景范围的方法(2维中对应的是extent). exte ...

  7. CodeForces 260A Adding Digits

    这道题目的意思是给你提供a, b, n 三个数 a为 输入的数字 ,你需要在a后面加n次 ,每次可以加0-9 但要保证每次加上去的那个数字能被b整除 不过数据规模有点大,用搜索会MLE(即使开了个开栈 ...

  8. MyEclipse8.5 中安装Spket插件

    MyEclipse8.5 中安装Spket插件 安装: 1. Myeclipse8.5安装和以前低版本有些不同(没有software updates). 点击help->Myeclipse Co ...

  9. 转:什么是 HTTP Headers?

    什么是HTTP Headers HTTP是“Hypertext Transfer Protocol”的所写,整个万维网都在使用这种协议,几乎你在浏览器里看到的大部分内容都是通过http协议来传输的,比 ...

  10. 不老的新丁 Python何以让人着迷

    Python是一门美丽的语言.它简单易学,跨平台,而且运转良好.达成了许多Java一直求索的技术目标.一言以蔽之就是:其他的语言是与时代同 步,而Python则是未雨绸缪,而且计划得颇为出色.当然,这 ...