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. Error creating bean with name 'enableRedisKeyspaceNotificationsInitializer'

    @Configuration public class HttpSessionConfig { @Bean public static ConfigureRedisAction configureRe ...

  2. Mylyn

    Mylyn(旧称Mylar)是eclipse的一个插件,用于将任务管理和上下文管理无缝集成到Eclipse中.1. 安装 下载相应的Mylyn zip包,解压缩开就是两个文件夹:features和pl ...

  3. Android Input设备debug技巧

    一.驱动层 检查是否有点上报 adb shell getevent -l /dev/input/eventX 检查input设备支持的属性值 adb shell getevent -i /dev/in ...

  4. unity3d大型手游 可以打包obb文件

    用unity3d开发手游,有个很大的问题就是apk的size太大, 如果超过50M,一般很多平台就不会肯上线. 一个好的方法是把app打成apk + obb数据包的方式. 1. 编译成obb数据包的方 ...

  5. SQL 表连接,内联、外联、全连

    内连接,join 或 inner join 两个表中符合条件的集合 外连接,left join  或  right  join 以left左边或right右边的表为数据集合行,根据条件,另一侧没有的数 ...

  6. 解决warning: incompatible implicit declaration of built-in function &#39;malloc&#39;

    因为代码中使用了malloc函数和字符串函数.编译时出现错误 warning: incompatible implicit declaration of built-in function 'mall ...

  7. ZOJ3640-Help Me Escape

    Help Me Escape Time Limit: 2 Seconds      Memory Limit: 32768 KB Background     If thou doest well, ...

  8. SPI通信

    SPI是由Motorola公司提出的一种同步串行外围接口:它在速度要求不高,低功耗,需要保存少量参数的智能化传感系统中得到了广泛应用: SPI是一个全双工的同步串行接口,在数据传输过程中,总线上只能是 ...

  9. 【Eclipse】Tomcat 一直处于starting状态,项目却已成功启动

    是因为Eclipse里面设置了代理.preference-network connections-activity provider-direct-应用.重启tomcat即可.

  10. Cocoapods安装步骤

    Cocoapods安装步骤 1.升级Ruby环境 终端输⼊入:$ gem update --system 此时会出现 ERROR: While executing gem ... (Gem::File ...