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);
}
}

最新文章

  1. xml 的读写
  2. Linux-TCP Queue的一些问题
  3. 如何通过CRM评估客户价值和提高客户忠诚度?
  4. Java与.NET DES加密解密互转
  5. vc终端输入结束符
  6. jenkens构建脚本
  7. Java的JDBC事务详解(转)
  8. 调用相册怎么设置剪裁-b
  9. 用word2013写博客
  10. ssh互信自动化脚本(待更新)
  11. 追踪神秘的成都Uber:月入2万元是现实还是传说
  12. Objc中为何某些类的属性要设置为copy而不是strong?
  13. JAVA之旅(一)——基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算
  14. 基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN
  15. C 一维数组 冒泡排序,查最大值
  16. imp 导入以及换用户报错
  17. 巩固python基础
  18. 【SRM-06 D】五色战队&amp;&amp;【codeforces 788E】 New task
  19. nasm学习资料
  20. 13--Python入门--文件读写--CSV&amp;Excel文件

热门文章

  1. android CircularSeekBar
  2. poj1742 多重背包的可行性问题
  3. 查看一个int数组里边的每个数字出现过几次
  4. Git简介及安装和简单配置
  5. git阶段学习总结
  6. BZOJ 1977: [BeiJing2010组队]次小生成树 Tree( MST + 树链剖分 + RMQ )
  7. application(CURD)--easyui
  8. HDU 3909 DLX
  9. 从java main方法说开去(转)
  10. Search Insert Position--寻找插入点Given a sorted array and a target value, return the index if the target