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中查看。

  • 可替换性原则:

  1. 利用抽象类与接口从具体的类中抽象出方法

    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模式(观察者设计模式)的更多相关文章

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

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

  2. 设计模式之观察者(OBSERVER)模式

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

  3. 设计模式C++描述----04.观察者(Observer)模式

    一. 概述 Observer 模式要解决的问题为:建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候,依赖这个“一”的多也能够同步改变. Sbuject 相当于 ...

  4. Java设计模式之从[星际争霸的兵种升级]分析观察者(Observer)模式

    观察者模式定义对象的一种一对多的依赖关系.当一个对象的状态发生改变时.全部依赖于它的对象都会得到通知并被自己主动更新. 一个简单的样例是.在星际争霸的虫族中有一个0基础单位叫做跳狗(Zergling) ...

  5. 设计模式之美:Observer(观察者)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Observer 模式结构样式代码. 别名 Dependency Publish-Subscribe 意图 定义对象间的一种一对 ...

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

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

  7. 设计模式(十七)Observer模式

    在Observer模式中,当观察对象的状态发生变化时,会通知给观察者.Observer模式适用于根据对象状态进行相应处理的场景. 首先看一下示例程序的视图. 然后用实际代码来理解这种设计模式. pac ...

  8. 设计模式:Observer(观察者)—— Guava EventBus

    本文分为三个部分:   Observer(观察者) Guava EventBus详解 Guava EventBus使用示例   1. Observer(观察者)   1.1 背景   我们设计系统时, ...

  9. (java)从零开始之--观察者设计模式Observer

    观察者设计模式:时当一个对象发生指定的动作时,要通过另外的对象做出相应的处理. 步骤: 1. A对象发生指定的动作是,要通知B,C,D...对象做出相应的处理,这时候应该把B,C,D...对象针对A对 ...

随机推荐

  1. RTSP协议分析(二)

    以下是某省IPTV的RTSP协商过程: DESCRIBE rtsp://118.122.89.27:554/live/ch10083121594790060557.sdp?playtype=1& ...

  2. vs code 安装Scala

    首先本机要安装scala(官网肿么下不了,CSDN上面下的): 配置scala到环境变量PATH中(Scala的根目录): VS中安装以下扩展: 1. Scala: 2. Sbt: 3. Code R ...

  3. 洛谷【P2115】[USACO14MAR]破坏Sabotage

    我对二分的理解:https://www.cnblogs.com/AKMer/p/9737477.html 题目传送门:https://www.luogu.org/problemnew/show/P21 ...

  4. Fortify代码扫描解决方案

    Fortify扫描漏洞解决方案: Log Forging漏洞: 1.数据从一个不可信赖的数据源进入应用程序. 在这种情况下,数据经由getParameter()到后台. 2. 数据写入到应用程序或系统 ...

  5. java代码Math.sqrt

    总结:这个判断小数的题目,当时全只2有一个人想出了结果.老师很开心.我很桑心~~~~ 我没想到要取膜,我只想到了除以等于0就够了.至于中间的“取膜”,我没凑齐来,还是不够灵活 package com. ...

  6. VisualGDB系列5:使用VS来开发Linux程序

    根据VisualGDB官网(https://visualgdb.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指正. 本文演示如何使用VS来构建和调试Linu ...

  7. python编程范式培训文档,主要是结合4种代码和,对oop和面向过程编程区别和oop转化公式培训。

    这是写得培训文档.代码例子在附件. 是经过深入考察 4个git项目里面,找出代码非常非常十分low.代码重复得吓人的的最本质原因.提炼出oop转化公式. 围绕附件中的4种代码写法思维来实现同一个任务, ...

  8. [原创] 新人分享--ORA-01012:not logged on的解决办法 [复制链接]

    转自:http://f.dataguru.cn/thread-82530-1-1.html

  9. Ok6410裸机驱动学习(二)ARM基础知识

    1.ARM工作模式 ARM微处理器支持7种工作模式,分别为: l  用户模式(usr):ARM处理器正常的程序执行状态(Linux用户态程序) l  快速中断模式(fiq):用于高速数据传输或通道处理 ...

  10. /*用户登录注册页面输入框的设置*/<span>的使用

    <!DOCTYPE html> /*用户登录注册页面输入框的设置*/ <html lang="en"> <head> <meta char ...