设计模式(十七)Observer模式
在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模式的更多相关文章
- 【转】设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 3)Javascript设计模式:Observer模式
Observer模式 var Observer = (function() { var instance = null; function Observe() { this.events = {} } ...
- 设计模式之——Observer模式
Observer模式又叫做观察者模式,当观察对象状态发生变化的时候,就会通知给观察者.这种模式适用于根据对象状态进行响应的场景! 实例程序是一个输出数字的程序. 观察者Observer类用于每500m ...
- 面向对象设计模式——观察者(OBSERVER)模式
定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...
- 设计模式:observer模式
目标:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 例子: class Observer //观察者 { public: virtual vo ...
- 北风设计模式课程---状态模式State(对象行为型)
北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...
- 设计模式---组件协作模式之观察者模式(Observer)
一:概念 Observer模式的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态 Observer模式提供给关联对象一种同步通信的手段,使得某个对象与依赖他的其他对象之间保 ...
- Java设计模式(20)观察者模式(Observer模式)
Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循 ...
随机推荐
- svn报错Item is not readable svn解决方案
解决: 配置目录权限时如: [/]tangtx=rwyangcx=rwweishq=rw 结果组用户分别在根目录下可以正常show log,而在其子目录中show log都会提示 Item is no ...
- 并发编程之多线程(Java)
一.线程与进程区别 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行.也可以把它理解为代码运行的上下文.所以线程基本上是 ...
- Winows 2008远程桌面访问多用户设置
一张图
- Scala Try Catch Finally
Scala Try Catch Finally: 在Java中返回值优先级顺序:finally最高, try,catch 选其一,try中抛异常,返回catch,不抛异常,返回try,. public ...
- Eclipse的Debug(一)
本文链接:https://blog.csdn.net/u011781521/article/details/55000066 http://blog.csdn.net/u010075335/ar ...
- 分库分表(5) ---SpringBoot + ShardingSphere 实现分库分表
分库分表(5)--- ShardingSphere实现分库分表 有关分库分表前面写了四篇博客: 1.分库分表(1) --- 理论 2.分库分表(2) --- ShardingSphere(理论) 3. ...
- CSS 选择符有哪些?哪些属性可以继承?优先级算法如何计算?
CSS 选择符有哪些? 1.id选择器(#id) 2.类选择器(.class) 3.标签选择器(div,h1,p) 4.相邻选择器(h1 + p) 5.子选择器(ul > li) 6.后代选择器 ...
- canvas实现平面迁徙图
前言 最近在做自己维护的一个可视化工具的时候,在添加基于echart的雷达图的时候,按照echart官网案例写完发现在自己项目中无法正常运行,排查了一番发现是我项目中echart的版本太低.找到问题原 ...
- 网页布局——table布局
table 的特性决定了它非常适合用来做布局,并且表格中的内容可以自动居中,这是之前用的特别多的一种布局方式 而且也加入了 display:table;dispaly:table-cell 来支持 t ...
- NOIP2014联合权值
无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi ,每条边的长度均为1.图上两点(u, v)的距离定义为u点到v点的最短距离.对于图G上的点对(u, v),若它们的距离 ...