首页 > 其他分享 >设计模式-观察者模式

设计模式-观察者模式

时间:2024-06-23 23:10:35浏览次数:13  
标签:guava name 观察者 模式 设计模式 com public String

观察者模式

观察者模式(Observer Pattern),又叫发布-订阅(Publisher/Subscribe)模式,模型-视图模式,源-监听器模式或从属者模式。定义一种一对多的依赖关系,一个主题对象可以同时被多个监听者同时监听,使得每当主题对象状态发生变化时,所有依赖于它的对象都会得到通知并被自动更新。属于行为型模式。

应用场景

  • 当一个抽象模型包含两个方面内容,其中一个方面依赖于另一个方面
  • 一个或多个对象的变化依赖于另一个对象的变化
  • 实现类似广播机制的功能,无需知道具体收听者,只需分发广播,系统中感兴趣的对象会自动接收该广播。
  • 多层级嵌套使用,形成一种链式触发机制。使得事件具备跨域通知

角色

  • 抽象主题(Subject):指被观察的对象。该角色是一个抽象类或接口,定义了增加,删除,通知观察者对象的方法
  • 具体主题(ConcreteSubject):具体被观察者,当其内部状态发生变化时,会通知已注册的观察者
  • 抽象观察者(Observer):定义了响应通知的更新 方法
  • 具体观察者(ConcreteObserver):在得到状态更新时,会自动做出响应

使用

一般很少自己去实现,当然真的要去实现,可以在被观察者中维护一份观察者列表,支持注册注销等操作,有一个通知方法即可
JDK本身也提供了该模式的API,将类继承Observeble即可作为被观察者,实现接口Observer,并重写update方法即可作为观察者。使用时只需要将观察者通过addObserver注册进去即可

当然也可以使用谷歌提供的工具,需要引入依赖:

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>20.0</version>
        </dependency>

然后通过注解标明监听者即可。
代码如下:
创建Vo 与 PoJo模拟两种类型的事件,只会监听对应的事件

package com.caozz.demo2.observer.guava;

public class Pojo {
    private String name;

    public Pojo(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Pojo{" +
                "name='" + name + '\'' +
                '}';
    }
}

package com.caozz.demo2.observer.guava;

public class Vo {
    private String name;

    public Vo(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Vo{" +
                "name='" + name + '\'' +
                '}';
    }
}

package com.caozz.demo2.observer.guava;

import com.google.common.eventbus.Subscribe;

public class PojoEvent {

    @Subscribe
    public void observer(Pojo pojo){
        System.out.println("执行PojoEvent方法,传参为:" + pojo);
    }

}
package com.caozz.demo2.observer.guava;

import com.google.common.eventbus.Subscribe;

public class VoEvent {

    @Subscribe
    public void observer(Vo arg){
//        if(arg instanceof Vo){
            System.out.println("执行VoEvent方法,传参为:" + arg);
//        }

    }

}

package com.caozz.demo2.observer.guava;

import com.google.common.eventbus.EventBus;

public class Test {

    public static void main(String[] args) {
        EventBus eventBus = new EventBus();


        PojoEvent guavaEvent = new PojoEvent();
        VoEvent voEvent = new VoEvent();
        eventBus.register(guavaEvent);
        eventBus.register(voEvent);

        eventBus.post(new Pojo("Tom"));
        eventBus.post(new Vo("Jerry"));
    }
}
欢迎大家留言,以便于后面的人更快解决问题!另外亦欢迎大家可以关注我的微信公众号,方便利用零碎时间互相交流。共勉!

标签:guava,name,观察者,模式,设计模式,com,public,String
From: https://www.cnblogs.com/caozz/p/18264078/observer

相关文章

  • [最全]设计模式实战(总序)
    最近一段时间,读完了《Android源码设计模式-解析与实战》和《大话设计模式》这两本经典设计模式相关书籍,撰写相关笔记。每种设计模式将从以下方式聊聊:1.是什么(What,即定义);解决什么问题(Why,即使用场景)2.如何使用(How,即最简UML图+Java代码)3.生活场景举例(贴近生活,更易理解)4.......
  • [模式识别复习笔记] 第9章 神经网络及BP算法
    1.基本概念1.1神经元神经网络是很多的神经元模型按照一定的层次结构连接起来所构成的。1.2激活函数\(\text{ReLU}\)函数:修正线性单元ReLU,是一种人工神经网络中常用的激活函数。\[\text{ReLU}(x)=\max(0,x)\]\(\text{sgn}\)阶跃函数:它将输入值映射为......
  • (超详细,超易懂)设计模式(三):抽象工厂模式,灵山派系谁上位
            如果你也喜欢C#开发或者.NET开发,可以关注我,我会一直更新相关内容,并且会是超级详细的教程,只要你有耐心,基本上不会有什么问题,如果有不懂的,也可以私信我加我联系方式,我将毫无保留的将我的经验和技术分享给你,不为其他,只为有更多的人进度代码的世界,而进入代码的世界......
  • 《分析模式》漫谈04- 反射·电动车周某
    DDD领域驱动设计批评文集做强化自测题获得“软件方法建模师”称号《软件方法》各章合集《分析模式》第2章里面有这么一段话:里面提到两个词,一个是reflection,一个是mapping。2004中译本的翻译是这样的:这个翻译把reflection和后面的similar合并在一起称为“相互对应”,......
  • 《分析模式》“鸦脚”表示法起源,Everest、Barker和Hay
    DDD领域驱动设计批评文集做强化自测题获得“软件方法建模师”称号《软件方法》各章合集《分析模式》这本书里面用的并不是UML表示法。作者MartinFowler在书中也说了,该书写于1994-1995年,当时还没有UML。作者在书中用的是一种常被人称为“鸦脚”的表示法。 有的同学会有......
  • 【python】在 Linux 中使用webdriver有头模式
    用webdriver模拟浏览网页时,可以使用无头模式,尤其在linux系统中,因为linux没有图形化界面,使用有头模式一般会报错。chrome_options.add_argument("--headless")#设置Chrome无头模式但是有些网站的反爬措施比较严格,使用无头模式会被识别出来,直接拒绝访问,这时候,就得使用有头......
  • 设计模式之单例模式
          ......
  • 设计模式-中介者模式
    中介者模式(MediatorPattern)中介者模式,又称为调解者模式或者调停者模式。它是用一个中介对象封装一系列的对象交互,使得各对象不需要显示的相互调用,降低耦合性,而且可以独立的改变这些对象之间的交互,属于行为型模式。中介者模式的核心思想是通过中介者对象解耦系统各层次对象的......
  • 设计模式-解释器模式
    解释器模式(InterPreterPattern)解释器模式是指给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子,并按照规定的语法进行解析的模式,属于行为型模式。比如编译器可以将源码编译为机器码,让CPU能进行识别并运行。解释器模式的作用其实与......
  • 设计模式之-代理模式
    代理模式是一种结构型设计模式,它允许你提供一个代理对象来控制对其他对象的访问。代理模式主要解决的问题是在某些情况下,直接访问一个对象可能会带来一些问题,比如对象的创建和销毁需要额外的开销,或者需要对对象的访问进行控制和限制。需要使用代理模式的时候,通常有以下情况:对......