在Observer模式中,当观察对象的状态发生变化时,会通知给观察者。Observer模式适用于根据对象状态进行相应处理的场景。

  首先看一下示例程序的视图。

  然后用实际代码来理解这种设计模式。

 package bigjunoba.bjtu.observer;

 public interface Observer {

     public abstract void update(NumberGenerator generator);
}

  Observer接口是用来表示“观察者”的接口。具体的观察者会实现这个接口。用于生成数值的NumberGenerator类会调用update方法。如果调用update方法,NumberGenerator类就会将“生成的数值发生了变化,请更新显示内容”的通知发送给Observer。

 package bigjunoba.bjtu.observer;

 import java.util.ArrayList;
import java.util.Iterator; public abstract class NumberGenerator { private ArrayList<Observer> observers = new ArrayList<>(); public void addObserver(Observer observer) {
observers.add(observer);
} public void deleteObserver(Observer observer) {
observers.remove(observer);
} public void notifyObservers() {
Iterator<Observer> iterator = observers.iterator();
while (iterator.hasNext()) {
Observer observer = (Observer) iterator.next();
observer.update(this);
}
} public abstract int getNumber();
public abstract void excute(); }

  NumberGenerator类是用于生成数值的抽象类。生成数值的excute方法和获取数值的getNumber方法都是抽象方法,需要子类去实现。observers字段中保存有观察NumberGenerator的Observer们。notifyObservers方法会向所有的Observer发送通知,告诉他们“我生成的数值发生了变化,请更新显示内容”。该方法会调用每个Observer的update方法。

 package bigjunoba.bjtu.observer;

 import java.util.Random;

 public class RandomNumberGenetor extends NumberGenerator {

     private Random random = new Random();
private int number; @Override
public int getNumber() {
return number;
} @Override
public void excute() {
for (int i = 0; i < 10; i++) {
number = random.nextInt(50);
notifyObservers();
}
}
}

  RandomNumberGenetor类是NumberGenerator的子类。excute方法会生成10个随机数,并通过notifyObservers方法把每次生成的结果通知给观察者。

 package bigjunoba.bjtu.observer;

 public class DigitObserver implements Observer {

     @Override
public void update(NumberGenerator generator) {
System.out.println("DigitObserver:" + generator.getNumber());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
}

  DigitObserver类作为第一个观察者,它的功能是以数字形式显示观察到的数值。为了能看清它是如何显示数值的,使用Thread.sleep(100)来降低程序的运行速度。

 package bigjunoba.bjtu.observer;

 public class GraphObserver implements Observer {

     @Override
public void update(NumberGenerator generator) {
System.out.println("GraphObserver:"); int count = generator.getNumber();
for (int i = 0; i < count; i++) {
System.out.print("*");
} System.out.println(""); try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
}

  GraphObserver类作为第二个观察者,功能是将观察到的数值以****表示出来。

 package bigjunoba.bjtu.observer;

 public class Main {
public static void main(String[] args) {
NumberGenerator generator = new RandomNumberGenetor();
Observer observer1 = new DigitObserver();
Observer observer2 = new GraphObserver();
generator.addObserver(observer1);
generator.addObserver(observer2);
generator.excute();
}
}

  Main类作为测试类。首先生成了RandomNumberGenerator类的实例保存在NumberGenerator类的generator字段中,然后生成两个观察者实例,然后将观察者注册之后,调用每一个观察者的update方法。

DigitObserver:20
GraphObserver:
********************
DigitObserver:46
GraphObserver:
**********************************************
DigitObserver:10
GraphObserver:
**********
DigitObserver:45
GraphObserver:
*********************************************
DigitObserver:10
GraphObserver:
**********
DigitObserver:5
GraphObserver:
*****
DigitObserver:37
GraphObserver:
*************************************
DigitObserver:24
GraphObserver:
************************
DigitObserver:34
GraphObserver:
**********************************
DigitObserver:30
GraphObserver:
******************************

  测试结果如上图所示。

  这里不作过多解释。因为这种设计模式还是很容易理解的。

设计模式(十七)Observer模式的更多相关文章

  1. 【转】设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  2. 设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  3. 3)Javascript设计模式:Observer模式

    Observer模式 var Observer = (function() { var instance = null; function Observe() { this.events = {} } ...

  4. 设计模式之——Observer模式

    Observer模式又叫做观察者模式,当观察对象状态发生变化的时候,就会通知给观察者.这种模式适用于根据对象状态进行响应的场景! 实例程序是一个输出数字的程序. 观察者Observer类用于每500m ...

  5. 面向对象设计模式——观察者(OBSERVER)模式

    定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.  Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...

  6. 设计模式:observer模式

    目标:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 例子: class Observer //观察者 { public: virtual vo ...

  7. 北风设计模式课程---状态模式State(对象行为型)

    北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...

  8. 设计模式---组件协作模式之观察者模式(Observer)

    一:概念 Observer模式的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态 Observer模式提供给关联对象一种同步通信的手段,使得某个对象与依赖他的其他对象之间保 ...

  9. Java设计模式(20)观察者模式(Observer模式)

    Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循 ...

随机推荐

  1. mysql安装可能遇到的错误和安装过程

    http://jingyan.baidu.com/article/8ebacdf02e392a49f65cd52d.html

  2. JIRA集成GitHub

    原因: 作为管理员, 为用户提高效率的角度,配置测试此服务.让用户从JIRA内看到代码分支,提交信息,pull requests等等, 让Github的代码提交记录和JIRA的任务管理系统集成在一起, ...

  3. linux mysql中文乱码解决

    测试的机器是ubuntu 12.04个别linux发行版可能略有不同. 登陆mysql查看当前字符集命令: mysql> show variable like '%char%'; +------ ...

  4. layDate——设置最大日期不能超过当前日期

    例如,当前年份是2018年,实现效果如下,2018年之后年份不可操作: 具体代码实现: layui.use([ 'laydate'], function () { var laydate = layu ...

  5. [Mathematics][MIT 18.03] Proof of a Theory about the Solution to Second-order Linear Homogeneous Differential Equation

    At first, I'd like to say thank you to MIT open courses which give me the privilege to enjoy the mos ...

  6. Java 学习笔记之 实例变量与线程安全

    实例变量与线程安全: 不共享数据: public class NoSharedThread extends Thread { private int count = 5; public NoShare ...

  7. Python多任务之进程

    Process多进程 进程的概念 程序是没有运行的代码,静态的: 进程是运行起来的程序,进程是一个程序运行起来之后和资源的总称: 程序只有一个,但同一份程序可以有多个进程:例如,电脑上多开QQ: 程序 ...

  8. 浅析十大常见排序(含C++代码)

    首先声明一下,本文只对十种排序算法做简单总结,并参照一些资料给出自己的代码实现,并没有对某种算法理论讲解,更详细的 了解可以参考以下资料: 1.<data structure and algor ...

  9. python编程基础之十四

    列表的增加元素 l1 = [10, 20, 30] l1.append(40)  # 末尾追加一个值为40的元素 l1.extend([50, 60])  # 末尾追加一系列元素,extend + 可 ...

  10. 两种高效的事件处理模型:Reactor模式和Proactor模式

    随着IO多路复用技术的出现,出现了很多事件处理模式.同步I/O模型通常由Reactor模式实现,而异步I/O模型则由Proactor模式实现. Reactor模式: Reator类图如上所示,Reac ...