设计模式学习笔记——观察者(Observer)模式

@(设计模式)[设计模式, 观察者模式, Observer]

  • 设计模式学习笔记观察者Observer模式

    • 基本介绍
    • 观察者案例
      • 类图
      • 实现代码
        • Observer接口
        • DigitObserver类
        • GraphObserver类
        • NumberGenerator抽象类
        • RandomNumberGenerator类
        • 测试类
        • 运行结果
    • 观察者模式中的角色
      • Subject观察对象
      • ConcreteSubject具体的观察对象
      • Observer观察者
      • ConcreteObserver具体的观察者
      • 类图

基本介绍

观察者模式也称为发布-订阅模式。
在观察者订阅被观察者发布的内容时,所订阅的内容发生变化,观察者会接到相应通知。观察者可以进行相应处理。

观察者案例

类图

实现代码

Observer接口

package com.pc.observer.example;/*** 观察者接口* Created by Switch on 2017/3/30.*/
public interface Observer {/*** 更新** @param generator 数值生成器*/void update(NumberGenerator generator);
}

DigitObserver类

package com.pc.observer.example;/*** 数字观察者对象* Created by Switch on 2017/3/30.*/
public class DigitObserver implements Observer {@Overridepublic void update(NumberGenerator generator) {System.out.println("DigitObserver:" + generator.getNumber());try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}
}

GraphObserver类

package com.pc.observer.example;/*** 图形观察者类* Created by Switch on 2017/3/30.*/
public class GraphObserver implements Observer {@Overridepublic void update(NumberGenerator generator) {System.out.print("GraphObserver:");for (int i = 0; i < generator.getNumber(); i++) {System.out.print("*");}System.out.println();try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}
}

NumberGenerator抽象类

package com.pc.observer.example;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;/*** 数值生成器抽象类* Created by Switch on 2017/3/30.*/
public abstract class NumberGenerator {/*** 观察者列表*/private List<Observer> observers = new ArrayList<>();/*** 添加观察者** @param observer 观察者对象*/public void addObserver(Observer observer) {observers.add(observer);}/*** 删除指定观察者** @param observer 观察者对象*/public void deleteObserver(Observer observer) {observers.remove(observer);}/*** 向观察者列表中的所有观察者发送通知*/public void notifyObservers() {Iterator<Observer> it = observers.iterator();while (it.hasNext()) {Observer observer = it.next();observer.update(this);}}/*** 获取数值** @return 数值*/public abstract int getNumber();/*** 生成数值*/public abstract void execute();
}

RandomNumberGenerator类

package com.pc.observer.example;import java.util.Random;/*** 随机数值生成器类* Created by Switch on 2017/3/30.*/
public class RandomNumberGenerator extends NumberGenerator {/*** 随机数生成器*/private Random random = new Random();/*** 当前数值*/private int number;@Overridepublic int getNumber() {return this.number;}@Overridepublic void execute() {for (int i = 0; i < 20; i++) {number = random.nextInt(50);this.notifyObservers();}}
}

测试类

package com.pc.observer.example.test;import com.pc.observer.example.*;
import org.junit.Test;/*** DigitObserver Tester.** @author Switch* @version 1.0*/
public class ObserverTest {/*** 测试观察者模式*/@Testpublic void testObserver() {NumberGenerator generator = new RandomNumberGenerator();Observer observer1 = new DigitObserver();Observer observer2 = new GraphObserver();generator.addObserver(observer1);generator.addObserver(observer2);generator.execute();}
}

运行结果

DigitObserver:15
GraphObserver:***************
DigitObserver:43
GraphObserver:*******************************************
DigitObserver:17
GraphObserver:*****************
DigitObserver:21
GraphObserver:*********************
DigitObserver:12
GraphObserver:************
DigitObserver:15
GraphObserver:***************
DigitObserver:11
GraphObserver:***********
DigitObserver:34
GraphObserver:**********************************
DigitObserver:0
GraphObserver:
DigitObserver:37
GraphObserver:*************************************
DigitObserver:12
GraphObserver:************
DigitObserver:38
GraphObserver:**************************************
DigitObserver:22
GraphObserver:**********************
DigitObserver:30
GraphObserver:******************************
DigitObserver:1
GraphObserver:*
DigitObserver:28
GraphObserver:****************************
DigitObserver:44
GraphObserver:********************************************
DigitObserver:45
GraphObserver:*********************************************
DigitObserver:23
GraphObserver:***********************
DigitObserver:45
GraphObserver:*********************************************

观察者模式中的角色

Subject(观察对象)

Subject角色表示观察对象。Subject角色定义了注册观察者和删除观察者的方法。此外,它还声明了“获取现在的状态”的方法。在案例中,由NumberGenerator类扮演此角色。

ConcreteSubject(具体的观察对象)

ConcreteSubject角色表示具体的被观察对象。当自身状态发生变化后,它会通知所有已经注册的Observer角色。在案例中,由RandomNumberGenerator类扮演此角色。

Observer(观察者)

Observer角色负责接收来自Subject角色的状态变化的通知。为此,它声明了update方法。在案例中,由Observer接口扮演此角色。

ConcreteObserver(具体的观察者)

ConcreteObserver角色表示具体的Observer。当它的update方法被调用后,会去获取要观察的对象的最新状态。在案例中,由DigitObserver类和GraphObserver类扮演此角色。

类图

GitHub:DesignPatternStudy

——————参考《图解设计模式》

设计模式学习笔记——观察者(Observer)模式相关推荐

  1. 设计模式学习笔记——解释器(Interpreter)模式

    设计模式学习笔记--解释器(Interpreter)模式 @(设计模式)[设计模式, 解释器模式, Interpreter] 设计模式学习笔记解释器Interpreter模式 基本介绍 解释器案例 类 ...

  2. 设计模式学习笔记——命令(Command)模式

    设计模式学习笔记--命令(Command)模式 @(设计模式)[设计模式, 命令模式, command] 设计模式学习笔记命令Command模式 基本介绍 命令案例 类图 实现代码 Command接口 ...

  3. 设计模式学习笔记——代理(Proxy)模式

    设计模式学习笔记--代理(Proxy)模式 @(设计模式)[设计模式, 代理模式, proxy] 设计模式学习笔记代理Proxy模式 基本介绍 代理案例 类图 实现代码 Printable接口 Pri ...

  4. 设计模式学习笔记——状态(State)模式框架

    设计模式学习笔记--状态(State)模式框架 @(设计模式)[设计模式, 状态模式, State] 设计模式学习笔记状态State模式框架 基本介绍 状态案例 类图 实现代码 State接口 Day ...

  5. 设计模式学习笔记——备忘录(Memento)模式

    设计模式学习笔记--备忘录(Memento)模式 @(设计模式)[设计模式, 备忘录模式, memento] 设计模式学习笔记备忘录Memento模式 基本介绍 备忘录案例 类图 实现代码 Memen ...

  6. 设计模式学习笔记——外观(Facade)模式

    设计模式学习笔记--外观(Facade)模式 @(设计模式)[设计模式, 外观模式, facade] 设计模式学习笔记外观Facade模式 基本介绍 外观案例 类图 实现代码 Database类 ma ...

  7. 设计模式学习笔记——访问者(Visitor)模式

    设计模式学习笔记--访问者(Visitor)模式 @(设计模式)[设计模式, 访问者模式, visitor] 设计模式学习笔记访问者Visitor模式 基本介绍 访问者案例 类图 实现代码 Visit ...

  8. 设计模式学习笔记——装饰(Decorator)模式

    设计模式学习笔记--装饰(Decorator)模式 @(设计模式)[设计模式, 装饰模式, decorator] 设计模式学习笔记装饰Decorator模式 基本介绍 装饰案例 类图 实现代码 Dis ...

  9. 设计模式学习笔记——组合(Composite)模式

    设计模式学习笔记--组合(Composite)模式 @(设计模式)[设计模式, 组合模式, composite] 设计模式学习笔记组合Composite模式 基本介绍 组合案例 类图 实现代码 Ent ...

最新文章

  1. Github 一夜爆火:这份金九银十 Java 面试手册我给跪了
  2. css中display设置为table、table-row、table-cell后的作用及其注意点
  3. sqlserver 性能问题
  4. 页面事件(Init,Load,PreRender)执行顺序
  5. Lua 5.1.1 源代码阅读笔记
  6. 关于点名的简单python编程_如何用python编写一个简易的随机点名软件
  7. Java——多线程实现的三种方式
  8. Structure from motion 问题
  9. leetcode —— 238. 除自身以外数组的乘积
  10. 西安工业大学计算机专业好吗,西安工业大学(专业学位)计算机技术考研难吗
  11. 1090 Highest Price in Supply Chain (25 分)(模拟建树,找树的深度)牛客网过,pat没过...
  12. python有哪些用途-Python能用来做什么?以下是Python的三大主要用途
  13. 深度学习2.0-31.CIFAR100与VGG13实战
  14. Atitit 部署了个webdav服务 as root 目录 1.1. WEB-INF copy to root dir only a web.xml use... 1 1.2. Java.ba
  15. 每日一淘洞察市场消费真相,深挖三四五线城市消费者需求
  16. 玻璃纤维防火毯的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  17. LiveQing流媒体RTMP推流服务-如何获直播流地址 HLS/HTTP-FLV/WS-FLV/WebRTC/RTMP视频流地址
  18. springboot+vue+elementUI搭建个人博客
  19. linux考出光盘数据,电脑如何复制数据到光盘|电脑在光盘中存储数据的方法
  20. 【R语言】RMarkdown使用

热门文章

  1. 五、C#入门—流程控制
  2. .NET Core 3 WPF MVVM框架 Prism系列之事件聚合器
  3. 【CSS】学习笔记1 使用CSS样式表
  4. 风变编程课 囚徒困境 答案_当您对所有这些有用的在线编程课程感到不知所措时,如何摆脱困境...
  5. delphi5开发人员指南_成为企业家并发挥作用的开发人员指南
  6. 浅谈Java的数据结构
  7. 采样率,码率,帧率,I 帧,P 帧,B帧,RTP时间戳
  8. Scrapy的安装介绍
  9. git命令之:上传到的远程仓库
  10. 【CCF】201503-1图像旋转