Java 代码实例解析设计模式之监听者模式

代码展示

Main:测试类

ObServer:每个被监听的对象实现该接口,重写该方法,完成自己的业务

public interface ObServer {

    /**
     * 当某一个被监控的对象发生变化时
     * 所有实现该方法处理方法
     */
    void exceptionHandler();

}

Subject:监听者容器

public interface Subject {

    /**
     * 添加被观察对象
     */
    void add(ObServer obServer);

    /**
     * 通知所有被观察者完成自己的 exceptionHandler 方法
     */
    void notifyAllSubject();

}

SubjectHandler:监听者容器的实现类

public class SubjectHandler implements Subject {

    /**
     * 存放被监听对象
     */
    private static final List<ObServer> SUBJECTS = Collections.synchronizedList(new LinkedList<>());

    @Override
    public void add(ObServer subject) {
        SUBJECTS.add(subject);
    }

    @Override
    public void notifyAllSubject() {
        SUBJECTS.forEach(ObServer::exceptionHandler);
    }
}

Thread1、Thread2 测试对象

模拟两个线程对数据库操作,若Threa1执行时出异常了,那么终止所有线程并对其回滚。

Threa1:

public class Thread1 implements ObServer, Runnable {

    @SneakyThrows
    @Override
    public void run() {
        System.out.println("thread1 run");
        Thread.sleep(1000);
        System.out.println("t1 end");
    }

    @SneakyThrows
    @Override
    public void exceptionHandler() {
        System.out.println("thread1 rollback.....");
    }
}

Thread2:

public class Thread2 implements ObServer, Runnable {

    private static Thread CURRENT_THREAD;

    private static volatile boolean FLAG = false;

    @SneakyThrows
    @Override
    public void run() {
        CURRENT_THREAD = Thread.currentThread();
        System.out.println("thread2 running");
        int count = 0;
        while (!FLAG) {
            System.out.println(count);
            count++;
        }
        System.out.println("thread2 end");
    }

    @SneakyThrows
    @Override
    public void exceptionHandler() {
        FLAG = true;
        CURRENT_THREAD.interrupt();
        System.out.println("thread2 rollback.....");
    }
}

测试Demo

public static void main(String[] args) throws InterruptedException {

        // 创建监听容器
        Subject subject = new SubjectHandler();
        Thread1 thread1 = new Thread1();
        Thread2 thread2 = new Thread2();
        subject.add(thread1);
        subject.add(thread2);

        CompletableFuture.supplyAsync(() -> {
            new Thread(thread1).start();
            try {
                Thread.sleep(10);
                int a = 1 / 0; // 模拟线程1报错
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return true;
        }).exceptionally((error) -> {
            subject.notifyAllSubject();
            return false;
        });

        CompletableFuture.supplyAsync(() -> {
            new Thread(thread2).start();
            return true;
        }).exceptionally((error) -> {
            subject.notifyAllSubject();
            return false;
        });

        // main thread await
        Thread.sleep(60 * 1000);
    }

测试结果

在 java.util 包下提供了Observable(监听容器)和 Observer接口(被监听者),用法跟我们完全一致,只需实现Observer的update方法,把每个Observer子类添加到监听容器中。

注意:在调用监听容器的通知所有servers时首先调用一下其setChanged方法

将changed变为true(默认flase)

到此这篇关于Java 代码实例解析设计模式之监听者模式的文章就介绍到这了,更多相关Java 设计模式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java设计模式之java责任链模式详解

    目录 概述 结构 总结 在本讲,我们来学习一下行为型模式里面的第四个设计模式,即责任链模式. 概述 在学习责任链模式之前,我们先来看一下下面这段描述. 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同.例如,公司员工请假,可批假的领导有部门负责人.副总经理.总经理等,但是每个领导能批准的天数不同,员工必须根据自己要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名.电话和地址等信息,这增加了员工请假的难度.因为领导有很多,员工到底找哪位

  • Java设计模式之装饰者模式详解

    目录 具体代码: Person: Student: Doctor: DecoratePerson: ShoeDecorate: DressDecorate: 总结 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 以一个Person对象为例.Person作为一个接口,Student(学生)和Doctor(医生)为Person接口的两个具体类,DecoratorPerson为Pers

  • Java设计模式之java外观模式详解

    目录 模式动机 模式定义 模式结构 角色 模式分析 典型的外观角色代码 外观模式实例与解析 实例一:电源总开关 实例二:文件加密 模式优缺点 优点 缺点 模式适用环境 源码分析外观模式的典型应用 (1) 外观模式应用于JDBC数据库操作 (2) Session外观模式是外观模式在Java EE框架中的应用 模式扩展 一个系统有多个外观类 不要试图通过外观类为子系统增加新行为 外观模式与迪米特法则 抽象外观类的引入 总结 参考文章 总结 模式动机 引入外观角色之后,用户只需要直接与外观角色交互,用

  • Java设计模式之java桥接模式详解

    目录 一.什么是桥接模式: 二.UML结构图: 三.代码实现: 四.JDBC源码解析-桥接模式: 1.源码分析: 2.源码类图: 3.对 JDBC 的观点: 参考博客: 总结 一.什么是桥接模式: 桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯,桥接模式的作用就是为被分离的抽象部分和实现部分搭桥.在现实生活中一个物品在搭配不同的配件时会产生不同的动作和结果,例如一辆赛车搭配的是硬胎或者是软胎就能够在干燥的马路上行驶,而如果要在下雨的路面行驶,就需要搭配雨胎了,这种根据行驶的路面不

  • Java设计模式之单例模式深入探索

    目录 什么是设计模式? 单例模式是什么? 单例模式设计的原则是什么? Java实现单例模式的5种方式? 懒汉 饿汉 静态内部类 双重校验锁DCL(Double Check Lock) 枚举(num) 小结 ❤️‍您好,我是贾斯汀,今天来聊一聊单例模式!❤️‍ 什么是设计模式? 百科: 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 设计模式是软件行业的通用的设计标准,在Java同样通用,主要有23种设计模式如下: 有的小伙伴可能会问,这么多,学得完吗? 答:不好意思

  • Java设计模式之java组合模式详解

    目录 引言 组合模式介绍 角色 模式结构 示例代码 水果盘 文件浏览 更复杂的组合模式 透明与安全 透明组合模式 安全组合模式 组合模式总结 优点 缺点 适用场景 应用 XML文档解析 文件 HashMap Mybatis SqlNode中的组合模式 参考文章 总结 引言 树形结构不论在生活中或者是开发中都是一种非常常见的结构,一个容器对象(如文件夹)下可以存放多种不同的叶子对象或者容器对象,容器对象与叶子对象之间属性差别可能非常大. 由于容器对象和叶子对象在功能上的区别,在使用这些对象的代码中

  • JAVA设计模式零基础解析之单例模式的八种方式

    目录 单例模式简介: 单例模式优点: 应用场景: 单例设计模式的八种方式: 1.饿汉式(静态常量) 2.饿汉式(静态代码块) 3.懒汉式(线程不安全) 4.懒汉式(线程安全,同步方法) 5.懒汉式(线程安全,同步代码块) 6.双重检查(推荐使用) 7.静态内部类(推荐使用) 8.枚举(推荐使用) 单例模式在JDK应用的源码分析 单例模式注意事项和细节说明 单例模式简介: 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了

  • java设计模式理解依赖于抽象不依赖具体的分析

    在面向对象设计原则中,要求"要依赖于抽象,不要依赖于具体", 这句话有很多人搞不懂.在这里谈谈我自己的理解.首先看看以下代码 class A{ public void swim(){ Dog dog = new Dog(); dog.move(); } } swim方法中定义了一个Dog的对象,那么无论哪个对象调用这个方法时,一定是"狗爬",swim和Dog的对象是紧耦合的关系,我们想换成鸭子是不可能. 假如代码这样换一下,我们定义一个动物的接口,接口定义一个mov

  • Java 代码实例解析设计模式之监听者模式

    代码展示 Main:测试类 ObServer:每个被监听的对象实现该接口,重写该方法,完成自己的业务 public interface ObServer { /** * 当某一个被监控的对象发生变化时 * 所有实现该方法处理方法 */ void exceptionHandler(); } Subject:监听者容器 public interface Subject { /** * 添加被观察对象 */ void add(ObServer obServer); /** * 通知所有被观察者完成自己

  • 实例解析设计模式中的外观模式在iOS App开发中的运用

    外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义 一个高层接口,这个接口使得这一子系统更加容易使用. 下面给大家展示一下类的结构图,想必大家一看就明白了: 其实这个模式中,没有类与类之间的继承关系,只是进行了简单的类引用,统一了对外的接口而已.看起来是不是很简单?废话不多说了,下面简单向大家展示一下代码吧! 注意:本文所有代码均在ARC环境下编译通过. SubSystemOne类接口 复制代码 代码如下: #import <Foundation/Foundation.

  • Apache Calcite进行SQL解析(java代码实例)

    背景 当一个项目分了很多模块,很多个服务的时候,一些公共的配置就需要统一管理了,于是就有了元数据驱动! 简介 什么是Calcite?是一款开源SQL解析工具, 可以将各种SQL语句解析成抽象语法树AST(Abstract Syntax Tree), 之后通过操作AST就可以把SQL中所要表达的算法与关系体现在具体代码之中.Calcite能做啥? SQL 解析 SQL 校验 查询优化 SQL 生成器 数据连接 实例 今天主要是贴出一个java代码实例,实现了:解析SQL语句中的表名上代码:SQL语

  • RocketMQ重试机制及消息幂代码实例解析

    这篇文章主要介绍了RocketMQ重试机制及消息幂代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.重试机制 1.由于MQ经常处于复杂的分布式系统中,考虑网络波动,服务宕机,程序异常因素,很有可能出现消息发送或者消费失败的问题.因此,消息的重试就是所有MQ中间件必须考虑到的一个关键点.如果没有消息重试,就可能产生消息丢失的问题,可能对系统产生很大的影响.所以,秉承宁可多发消息,也不可丢失消息的原则,大部分MQ都对消息重试提供了很好

  • Java与Android使用监听者模式示例

    目录 正文 Java代码实例 Android中使用监听器 正文 监听者模式(观察者模式)能降低对象之间耦合程度.为两个相互依赖调用的类进行解耦. 便于进行模块化开发工作.不同模块的开发者可以专注于自身的代码. 监听者用来监听自已感兴趣的事件,当收到自已感兴趣的事件时执行自定义的操作.在某些数据变化时,其他的类做出一些响应.处理数据(或者分发事件)的类主动投送消息,感兴趣的类主动“订阅”消息. 监听者模式在Android中有大量的运用,相信大家都不会感到陌生.在Android开发中,Button控

  • Java内省实例解析

    图像中轮廓的个数,里面vector的size代表了轮廓上点的个数.了解JavaBean 内省对应的英文单词为IntroSpector,它主要用于对JavaBean进行操作,JavaBean是一种特殊的Java类,其中的某些方法符合某种命名规则,如果一个Java类中的一些方法符合某种命名规则,则可以把它当作JavaBean来使用. JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则. 如果要在两个模块之间传递多个信息

  • vue封装swiper代码实例解析

    这篇文章主要介绍了vue封装swiper代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 data(){ return{ list:[], swiperOption:"", xiding : "", // 轮播高度 SwiperHeight:'' } }, mounted(){ this.onload() // 获取轮播图图片的高度 setTimeout(()=> { // 通过ref获取轮播dom

  • Spring Bean装载方式代码实例解析

    这篇文章主要介绍了Spring Bean装载方式代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Bean的装配方式 Bean的装配可以理解为依赖关系注入 基于XML的装配 a) 设值注入 i.要求: Bean 类必须提供一个默认的无参构造方法. Bean 类必须为需要注入的属性提供对应的setter方法. b) 构造注入 package com.itheima.assemble; import java.util.List; pub

  • 在Java代码中解析html,获取其中的值方法

    有时我们获取到了页面需要在Java代码中进行解析,获取html中的数据,Jsoup是一个很方便的工具. 一.什么是Jsoup? 官网网站:http://jsoup.org/ 可在官网下载对应的jar 通俗的将Jsoup就是一个解析网页的东西 二.示例 1.页面,通过查询获取到了一些数据: 2.源码,这是一个table,class="list",通过这些来唯一标识它 3.代码,将html以String的形式传进来,使用Jsoup进行解析: import org.jsoup.Jsoup;

  • Python解析json代码实例解析

    这篇文章主要介绍了Python解析json代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 什么是json格式: JSON(JavaScript Object Notation):一种轻量级数据交换格式,相对于XML而言更简单,也易于阅读和编写,机器也方便解析和生成,Json是JavaScript中的一个子集. import json data = { "statusCode": 200, "data":

随机推荐