设计模式学习笔记——观察者(Observer)模式
设计模式学习笔记——观察者(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)模式相关推荐
- 设计模式学习笔记——解释器(Interpreter)模式
设计模式学习笔记--解释器(Interpreter)模式 @(设计模式)[设计模式, 解释器模式, Interpreter] 设计模式学习笔记解释器Interpreter模式 基本介绍 解释器案例 类 ...
- 设计模式学习笔记——命令(Command)模式
设计模式学习笔记--命令(Command)模式 @(设计模式)[设计模式, 命令模式, command] 设计模式学习笔记命令Command模式 基本介绍 命令案例 类图 实现代码 Command接口 ...
- 设计模式学习笔记——代理(Proxy)模式
设计模式学习笔记--代理(Proxy)模式 @(设计模式)[设计模式, 代理模式, proxy] 设计模式学习笔记代理Proxy模式 基本介绍 代理案例 类图 实现代码 Printable接口 Pri ...
- 设计模式学习笔记——状态(State)模式框架
设计模式学习笔记--状态(State)模式框架 @(设计模式)[设计模式, 状态模式, State] 设计模式学习笔记状态State模式框架 基本介绍 状态案例 类图 实现代码 State接口 Day ...
- 设计模式学习笔记——备忘录(Memento)模式
设计模式学习笔记--备忘录(Memento)模式 @(设计模式)[设计模式, 备忘录模式, memento] 设计模式学习笔记备忘录Memento模式 基本介绍 备忘录案例 类图 实现代码 Memen ...
- 设计模式学习笔记——外观(Facade)模式
设计模式学习笔记--外观(Facade)模式 @(设计模式)[设计模式, 外观模式, facade] 设计模式学习笔记外观Facade模式 基本介绍 外观案例 类图 实现代码 Database类 ma ...
- 设计模式学习笔记——访问者(Visitor)模式
设计模式学习笔记--访问者(Visitor)模式 @(设计模式)[设计模式, 访问者模式, visitor] 设计模式学习笔记访问者Visitor模式 基本介绍 访问者案例 类图 实现代码 Visit ...
- 设计模式学习笔记——装饰(Decorator)模式
设计模式学习笔记--装饰(Decorator)模式 @(设计模式)[设计模式, 装饰模式, decorator] 设计模式学习笔记装饰Decorator模式 基本介绍 装饰案例 类图 实现代码 Dis ...
- 设计模式学习笔记——组合(Composite)模式
设计模式学习笔记--组合(Composite)模式 @(设计模式)[设计模式, 组合模式, composite] 设计模式学习笔记组合Composite模式 基本介绍 组合案例 类图 实现代码 Ent ...
最新文章
- Github 一夜爆火:这份金九银十 Java 面试手册我给跪了
- css中display设置为table、table-row、table-cell后的作用及其注意点
- sqlserver 性能问题
- 页面事件(Init,Load,PreRender)执行顺序
- Lua 5.1.1 源代码阅读笔记
- 关于点名的简单python编程_如何用python编写一个简易的随机点名软件
- Java——多线程实现的三种方式
- Structure from motion 问题
- leetcode —— 238. 除自身以外数组的乘积
- 西安工业大学计算机专业好吗,西安工业大学(专业学位)计算机技术考研难吗
- 1090 Highest Price in Supply Chain (25 分)(模拟建树,找树的深度)牛客网过,pat没过...
- python有哪些用途-Python能用来做什么?以下是Python的三大主要用途
- 深度学习2.0-31.CIFAR100与VGG13实战
- Atitit 部署了个webdav服务 as root 目录 1.1. WEB-INF copy to root dir only a web.xml use...	1 1.2. Java.ba
- 每日一淘洞察市场消费真相,深挖三四五线城市消费者需求
- 玻璃纤维防火毯的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- LiveQing流媒体RTMP推流服务-如何获直播流地址 HLS/HTTP-FLV/WS-FLV/WebRTC/RTMP视频流地址
- springboot+vue+elementUI搭建个人博客
- linux考出光盘数据,电脑如何复制数据到光盘|电脑在光盘中存储数据的方法
- 【R语言】RMarkdown使用