Observer模式(观察者设计模式)
Observer 设计模式?
在Observer模式中,当观察对象的状态发生变化时,会通知给观察者。Observer模式适用于根据对象状态进行相应处理的场景。
Observer 并非主动观察,而是被动观察,实际可以又称之为发布-订阅者模式
MVC
Model、View、Controller,并且Model里面的操作不依赖于具体形式的内部模型,通常情况下:
一个Model对应多个View,这里也是使用Observer设计模式最多的地方

java中观察者接口
在package java.util;下存在了Observer接口,按照二类定义模式,允许传递对象,以及附带参数
void update(Observable o, Object arg);
- 使用注意:java.util.observer接口和java.util.observable类并不好用。理由很简单,传递给java.util.observer接口的Subject角色必须是java.util.observable类型(或者它的子类型)的。但Java只能单一继承,也就说如果Subject角色已经是某个类的子类了,那么它将无法继承java.util.observable类。(单个使用还是可以的)
理清职责
- 实现功能:根据不同的观察者显示字符串的方式也不一样!
|名字=======》》》说明
|Observer || 表示观察者的接口
|NumberGenerator || 表示生成数值的对象的抽象类
|RandomNumberGenerator || 生成随机数的类
|Digitobserver || 表示以数字形式显示数值的类
|Graphobserver || 表示以简单的图示形式显示数值的类
|Main || 测试程序行为的类
Observer调用顺序问题:
当在Observer存在多个需要通知的方法时,方法一多,容易出现混乱,所以你这里使用template设计模式将在Observer定义的使用顺序,提前安排好,
那么子类去实现就行了。出现更改调用顺序的时机,只需要去Observer中查看。可替换性原则:
- 利用抽象类与接口从具体的类中抽象出方法
2.将实例作为参数传递到类中,或者在类的字段中保存实例时,不要使用具体的类型,而是使用抽象类型接口作为参数传递。
- 相关设计模式
◆Mediator模式
在Mediator模式中,有时会使用Observer 模式来实现Mediator角色与Colleague角色之间的通信。
就“发送状态变化通知”这一点而言,Mediator模式与Observer模式是类似的。不过,两种模式中,通知的目的和视角不同。
在Mediator模式中,虽然也会发送通知,不过那不过是为了对Colleague角色进行仲裁而已。
而在Observer模式中,将Subject角色的状态变化通知给Observer角色的目的则主要是为了使Subject角色和Observer角色同步。
UML

类图:

Code
- Observer 、NumberGenerator
public interface Observer {
/**
* 通知concreateObserver
* @param numberGenerator
*/
void update(NumberGenerator numberGenerator);
}
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);};
/**
* 通知所有的观察者
*/
protected void notifyObservers(){
Iterator<Observer> it = observers.iterator();
while (it.hasNext()){
Observer next = it.next();
next.update(this);
}
}
/**
* 获取数值
*/
public abstract int getNumber();
/**
* 生成数值
*/
public abstract void excute();
}
- Graphobserver 、Digitobserver 两个观察者
public class Digitobserver implements Observer {
@Override
public void update(NumberGenerator numberGenerator) {
System.out.println(this.getClass().getName()+":"+numberGenerator.getNumber());
try {
Thread.sleep(100);
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
public class Graphobserver implements Observer {
@Override
public void update(NumberGenerator numberGenerator) {
System.out.println(this.getClass().getName()+":");
for (int i = 0; i < numberGenerator.getNumber(); i++) {
System.out.print("*");
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
- RandomNumberGenerator
public class RandomNumberGenerator 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 < 20; i++) {
number=random.nextInt(50);
notifyObservers();
}
}
}
- MainT
public class MainT {
public static void main(String[] args) {
NumberGenerator generator = new RandomNumberGenerator();
// 观察者
Digitobserver digitobserver = new Digitobserver();
Graphobserver graphobserver = new Graphobserver();
generator.addObserver(digitobserver);
generator.addObserver(graphobserver);
generator.excute();
}
}
Observer模式(观察者设计模式)的更多相关文章
- 面向对象设计模式——观察者(OBSERVER)模式
定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...
- 设计模式之观察者(OBSERVER)模式
定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...
- 设计模式C++描述----04.观察者(Observer)模式
一. 概述 Observer 模式要解决的问题为:建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候,依赖这个“一”的多也能够同步改变. Sbuject 相当于 ...
- Java设计模式之从[星际争霸的兵种升级]分析观察者(Observer)模式
观察者模式定义对象的一种一对多的依赖关系.当一个对象的状态发生改变时.全部依赖于它的对象都会得到通知并被自己主动更新. 一个简单的样例是.在星际争霸的虫族中有一个0基础单位叫做跳狗(Zergling) ...
- 设计模式之美:Observer(观察者)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Observer 模式结构样式代码. 别名 Dependency Publish-Subscribe 意图 定义对象间的一种一对 ...
- Java设计模式(20)观察者模式(Observer模式)
Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循 ...
- 设计模式(十七)Observer模式
在Observer模式中,当观察对象的状态发生变化时,会通知给观察者.Observer模式适用于根据对象状态进行相应处理的场景. 首先看一下示例程序的视图. 然后用实际代码来理解这种设计模式. pac ...
- 设计模式:Observer(观察者)—— Guava EventBus
本文分为三个部分: Observer(观察者) Guava EventBus详解 Guava EventBus使用示例 1. Observer(观察者) 1.1 背景 我们设计系统时, ...
- (java)从零开始之--观察者设计模式Observer
观察者设计模式:时当一个对象发生指定的动作时,要通过另外的对象做出相应的处理. 步骤: 1. A对象发生指定的动作是,要通知B,C,D...对象做出相应的处理,这时候应该把B,C,D...对象针对A对 ...
随机推荐
- LOJ2303 「NOI2017」蚯蚓排队
「NOI2017」蚯蚓排队 题目描述 蚯蚓幼儿园有$n$只蚯蚓.幼儿园园长神刀手为了管理方便,时常让这些蚯蚓们列队表演. 所有蚯蚓用从$1$到$n$的连续正整数编号.每只蚯蚓的长度可以用一个正整数表示 ...
- 洛谷 P4220 & UOJ #347 通道 —— 随机化
题目:https://www.luogu.org/problemnew/show/P4220 http://uoj.ac/problem/347 先写了一下 n^2 和三棵树一样的情况,n^2 还写了 ...
- linux下dns设置详解
DNS就是Domain Name System,它能够把形如www.21php.com这样的域名转换为211.152.50.35这样的IP地址;没有DNS,浏览21php.com这个网站时,就必须用2 ...
- C++之Stack模板类
假设有这样一种情况:某人将一车文件交给小王.倘若小王的抽屉是空的,那么小王从车上取出最上面的文件将其放入抽屉:倘若抽屉是满的,小王从抽屉中取出最上面的文件,放入垃圾篓:倘若抽屉即不空也未满,那么小王抛 ...
- unreal3控制台窗口属性调整
在windows平台上,unreal3的console窗口类是FOutputDeviceConsoleWindows 启动时,它可以从XXXGame.ini中读取诸如窗口大小之类的属性,具体的代码在 ...
- Umbraco 的template使用的默认Model问题
Umbraco中的Template默认都继承自 Umbraco.Web.Mvc.UmbracoTemplatePage @inherits Umbraco.Web.Mvc.UmbracoTemplat ...
- 项目中缺少org.wltea.ik-analyzer如何解决?
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.从2006年12月推出1.0版开始,IKAnalyzer已经推出了3个大版本.最初,它是以开源项目Luence为应用主体 ...
- idea中java项目删除一个module
在idea中删除一个module,需要两步: 1. 使用Remove Module命令,快捷键是Delete 2. 经过第一步后,module图标上的小方块,消失,编程一个普通文件夹,这时使用Dele ...
- 【OpenGL】Shader概述
目录(?)[-] 综述 编译一个Shader 链接一个Shader 删除一个Shader 指定使用一个Shader Program 删除一个Shader Program 备注 这篇文章讲述了Shade ...
- Django 之 JsonResponse 对象
JsonResponse 是 HttpResponse 的子类,与父类的区别在于: JsonResponse 默认 Content-Type 类型为 application/json HttpResp ...