研磨设计模式day11观察者模式

这篇具有很好参考价值的文章主要介绍了研磨设计模式day11观察者模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

场景

代码示例

定义

观察者模式的优缺点

本质

何时选用

简单变型-区别对待观察者


场景

我是一家报社,每当我发布一个新的报纸时,所有订阅我家报社的读者都可以接收到

代码示例

报纸对象

package day11观察者模式;

import java.util.Observable;

/**
 * 报纸对象
 */
public class NewsPaper extends Observable {
    /**
     * 报纸的内容
     */
    private String content;

    /**
     * 获取报纸的具体内容
     * @return 报纸的具体内容
     */
    public String getContent() {
        return content;
    }

    /**
     * 示意,设置报纸的具体内容,相当于要出版报纸了
     * @param content 报纸的具体内容
     */
    public void setContent(String content) {
        this.content = content;
        // 内容有了,说明又出新报纸了,那就通知所有的读者
        this.setChanged();
        // 然后主动通知,用的推的方式
        this.notifyObservers(this.content);
        // 如果用拉的方式,这么调用
//        this.notifyObservers();
    }
}

读者,也就是观察者

package day11观察者模式;

import java.util.Observable;
import java.util.Observer;

/**
 * 真正的读者,也就是观察者
 */
public class Reader implements Observer {

    /**
     * 读者的姓名
     */
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void update(Observable o, Object arg) {
        // 这里采用推的方式
        System.out.println(name + "收到报纸了,进行阅读。目标推过来的内容是===" + arg);
        // 这里是获取拉的数据
//        System.out.println(name + "收到报纸了,进行阅读。主动到目标对象去拉的内容是===" + ((NewsPaper)o).getContent());
    }
}

client

package day11观察者模式;

/**
 * 客户端使用
 */
public class Client {
    public static void main(String[] args) {
        // 1.创建一个报纸,作为被观察者
        NewsPaper subject = new NewsPaper();
        // 2.创建阅读者,也就是观察者
        Reader reader1 = new Reader();
        reader1.setName("张三");

        Reader reader2 = new Reader();
        reader2.setName("李四");

        Reader reader3 = new Reader();
        reader3.setName("王五");

        // 3.注册阅读者
        subject.addObserver(reader1);
        subject.addObserver(reader2);
        subject.addObserver(reader3);

        // 4.要出报纸啦
        subject.setContent("本期内容是观察者模式");
    }
}

研磨设计模式day11观察者模式,设计模式,观察者模式

 解析:

报社就是一个发布者,读者就是一个个订阅者,发布者提供订阅方法,每次发布者发布新的东西时,就会通知订阅者这条新的消息。

报社NewsPaper:它继承了Observable类,这个类包含了注册方法,提示改变,通知方式(推和拉)等方法,NewsPaper包含了报纸内容对象,get方法就不说了,set时会进行提示改变了,并主动通知,用的推的方式。

观察者Reader:它实现了Observer接口,实现了update方法,java实现观察者模式时默认是拉模型,如果使用推模型,那么在update这个方法里通过推拉的获取方式都可以获取到值研磨设计模式day11观察者模式,设计模式,观察者模式

定义

研磨设计模式day11观察者模式,设计模式,观察者模式

类似发布订阅模式

观察者模式的优缺点

研磨设计模式day11观察者模式,设计模式,观察者模式

研磨设计模式day11观察者模式,设计模式,观察者模式

本质

观察者模式的本质:触发联动

在程序运行期间,通过这样的联动可以控制观察者,在update执行的时候。

何时选用

研磨设计模式day11观察者模式,设计模式,观察者模式

简单变型-区别对待观察者

举例:根据水质污染的严重程度来分别告知不同的管理者

研磨设计模式day11观察者模式,设计模式,观察者模式

思路:将水质污染当作被观察的目标,监测员、预警人员和领导就是观察者。在目标里面进行判断,满足就通知,不满足不通知。

观察者接口

1.被通知的方法2.设置观察人员的职务3.获取观察人员的职务

package day11观察者模式.高级;

/**
 * 水质观察者接口定义
 */
public interface WatcherObserver {
    /**
     * 被通知的方法
     * @param subject 传入被观察的目标对象
     */
    public void update(WaterQualitySubject subject);

    /**
     * 设置观察人员的职务
     * @param job
     */
    public void setJob(String job);

    /**
     * 获取观察人员的职务
     * @return
     */
    public String getJob();
    
}

观察者的具体实现

package day11观察者模式.高级;

public class Watcher implements WatcherObserver{
    private String job;

    @Override
    public void update(WaterQualitySubject subject) {
        // 这里采用拉的方式
        System.out.println(job + "获取到通知,当前污染级别为: " + subject.getPolluteLevel());
    }

    @Override
    public void setJob(String job) {
        this.job = job;
    }

    @Override
    public String getJob() {
        return job;
    }
}

目标的父对象(抽象类) :1.定义抽象是因为我们不需要全部都发消息,所以让子类去根据业务的实际需要自己去选择性的通知。2.而且在我们传入目标对象的时候具有很好的封装性,不需要对外展示具体的目标对象,传给观察者的只是目标的父抽象类。

研磨设计模式day11观察者模式,设计模式,观察者模式

package day11观察者模式.高级;

import java.util.ArrayList;
import java.util.List;

/**
 * 定义目标的父对象
 */
public abstract class WaterQualitySubject {
    /**
     * 用来保存注册的观察者对象
     */
    protected List<WatcherObserver> observers = new ArrayList<WatcherObserver>();

    /**
     * 注册观察者对象
     * @param observer  观察者对象
     */
    public void attach(WatcherObserver observer){
        observers.add(observer);
    }

    /**
     * 删除观察者对象
     * @param observer
     */
    public void detach(WatcherObserver observer){
        observers.remove(observer);
    }

    /**
     * 通知对应的观察者对象
     */
    public abstract void notifyWatchers();

    /**
     * 获取水质污染的级别
     */
    public abstract int getPolluteLevel();
}

目标的实现(继承目标父抽象类)

package day11观察者模式.高级;

/**
 * 具体的检测对象
 */
public class WaterQuality extends WaterQualitySubject{
    /**
     * 污染的级别,0正常 1轻度污染 2中度污染 3高度污染
     */
    private int polluteLevel = 0;

    /**
     * 获取水质污染的级别
     * @return
     */
    @Override
    public int getPolluteLevel() {
        return polluteLevel;
    }

    /**
     * 当检测水质情况后,设置水质污染的级别
     * @param polluteLevel 水质污染的级别
     */
    public void setPolluteLevel(int polluteLevel) {
        this.polluteLevel = polluteLevel;
        // 通知相应的观察者
        this.notifyWatchers();
    }

    /**
     * 通知相应的观察者对象
     */
    @Override
    public void notifyWatchers() {
        // 循环所有注册的观察者
        for (WatcherObserver watcher : observers) {
            // 开始根据污染级别判断都通知谁
            if (this.polluteLevel >= 0 ){
                // 通知监测员做记录
                if ("监测人员".equals(watcher.getJob())){
                    watcher.update(this);
                }
            }
            if (this.polluteLevel >= 1 ){
                // 通知监测员做记录
                if ("预警人员".equals(watcher.getJob())){
                    watcher.update(this);
                }
            }
            if (this.polluteLevel >= 2 ){
                // 通知监测员做记录
                if ("领导".equals(watcher.getJob())){
                    watcher.update(this);
                }
            }
        }
    }


}

client

package day11观察者模式.高级;

public class Client {
    public static void main(String[] args) {
        // 创建具体的检测对象
        WaterQuality subject = new WaterQuality();

        // 创建几个观察者
        Watcher watcher1 = new Watcher();
        watcher1.setJob("监测人员");
        Watcher watcher2 = new Watcher();
        watcher2.setJob("预警人员");
        Watcher watcher3 = new Watcher();
        watcher3.setJob("领导");

        // 注册观察者
        subject.attach(watcher1);
        subject.attach(watcher2);
        subject.attach(watcher3);

        // 填写水质报告
        System.out.println("水质正常---");
        subject.setPolluteLevel(0);
        System.out.println("轻度污染---");
        subject.setPolluteLevel(1);
        System.out.println("重度污染---");
        subject.setPolluteLevel(2);
    }
}

研磨设计模式day11观察者模式,设计模式,观察者模式

解析:

从client开始,先创建了具体的检测对象, 他有什么用呢?可以注册观察者,可以发布通知

创建了几个观察者实现对象,给他们赋予了不同的职务。

将观察者跟目标对象进行关联,也就是注册,点进去看一下,调用了attach方法,这个方法不是具体的检测对象本身的,而是它的抽象父类中的方法

研磨设计模式day11观察者模式,设计模式,观察者模式

都注册进去之后,目标对象开始运行,他现在出了一个水质为0的污染报告,这个时候应该传递给谁信息呢?

 研磨设计模式day11观察者模式,设计模式,观察者模式

点进这个setPolluteLevel(0)看一下 。这个是具体的检测对象本身的方法。

研磨设计模式day11观察者模式,设计模式,观察者模式

可以看出首先将传过来的值赋值给当前对象,然后调用了 this.notifyWatchers()方法。我们接着往下。

研磨设计模式day11观察者模式,设计模式,观察者模式

进来这个方法后,遍历所有注册到目标对象的观察者(订阅了该目标对象的订阅者),这个observers哪里来的?(研磨设计模式day11观察者模式,设计模式,观察者模式),是注册而来的。

接着判断属于哪一类的污染,此时过来的污染为0,就判断当前观察者的职务是不是检测人员,如果是就调用update更新的方法,如果不是就不用管。

我们看一下update,被通知方法的接口

研磨设计模式day11观察者模式,设计模式,观察者模式

 接下来看看它的实现

研磨设计模式day11观察者模式,设计模式,观察者模式

 解析:判断是不是检测人员,如果是我就给他发送消息(它就能接收到消息)。

如果污染为1,那么就满足两个条件,就会给预警人员和检测人员都发送消息文章来源地址https://www.toymoban.com/news/detail-673645.html

到了这里,关于研磨设计模式day11观察者模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式-观察者模式

    观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者

    2024年02月15日
    浏览(43)
  • 设计模式---观察者模式

    1,概念         属于行为模式的一种,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一对象主题对象,这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。 在观察者模式中有如下角色: Subject:抽象主题(抽象被观察者),

    2024年02月15日
    浏览(50)
  • 设计模式——14. 观察者模式

    观察者模式(Observer Pattern)是一种行为型设计模式,用于定义对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都能够自动收到通知并更新自己的状态,以保持与被观察对象的同步。观察者模式也被称为发布-订阅模式。 观察者模式包含以

    2024年02月07日
    浏览(35)
  • 设计模式之观察者模式

    可以帮你的对象知悉现况,不会错过该对象感兴趣的事。对象甚至在运行时可决定是否要继续被通知。 从报纸和杂志的订阅说起: 报社的业务就是出版报纸 向某家报社订阅报纸,只要他们有新报纸出版,就会给你送来。只要你是他们的订户,你就会一直收到新报纸。 当你不

    2024年01月24日
    浏览(41)
  • 重温设计模式 --- 观察者模式

    观察者模式 是一种行为型设计模式,它允许对象之间建立一种一对多的关系,使得当一个对象状态改变时,所有依赖它的对象都能够自动得到通知并更新自己的状态。该模式可以帮助我们实现松耦合的系统,以便更好地应对变化和扩展。 在观察者模式中,有两个角色: 观察

    2024年02月13日
    浏览(44)
  • 观察者设计模式

    行为型模式(Behavioral Patterns):这类模式主要关注对象之间的通信。它们 分别是: 职责链模式(Chain of Responsibility) 命令模式(Command) 解释器模式(Interpreter) 迭代器模式(Iterator) 中介者模式(Mediator) 备忘录模式(Memento) 观察者模式(Observer) 状态模式(State) 策略

    2024年01月24日
    浏览(35)
  • 设计模式-观察者

    观察者模式是一种广泛应用于软件开发中的行为设计模式,尤其是在面向对象编程(OOP)中。该模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新 在观察者模式中,存在两个主要角色: 主题(Subject) 或 被

    2024年01月22日
    浏览(33)
  • 设计模式:行为型模式 - 观察者模式

    定义: 又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。 在观察者模式中有如下角色: Subject:抽象主题(抽象被观察

    2023年04月22日
    浏览(84)
  • js设计模式:观察者模式

    和发布订阅模式基本类似。 当某一对象状态发生变化时,所有的观察者都会收到通知。 vue响应式原理就是很经典的案例,数据发生变化,通知各个依赖。

    2024年02月19日
    浏览(20)
  • 设计模式之二:观察者模式

    假定我们需要为Weather-O-Rama公司建立一个气象站系统,除已有的WeatherData有数据源类,还需要更新三个布告板的显示:目前状况(温度、湿度、气压)、气象统计和天气预报。  1 以下是一个可能的实现 上述实现有以下问题存在: 针对具体实现编程,而非针对接口(currentCon

    2024年02月13日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包