一、枚举类型——用枚举实现职责链模式

news2024/11/19 18:43:38

职责链(Chain of Responsibility)设计模式先创建了一批用于解决目标问题的不同方法,然后将它们连成一条“链”。当一个请求到达时,会顺着这条链传递下去,直到遇到链上某个可以处理该请求的方法。

可以很容易地用常量特定方法实现一条简单的职责链。考虑一个邮局模型,它对每一封邮件都会尝试用最常见的方式来处理,(如果行不通)并不断尝试别的方式,直到该邮件最终被视为“死信”(无法投递)。每种尝试都可以看作一个策略(另一种设计模式),而整个策略列表放在一起就是一条职责链。

我们从一封邮件开始说起。它所有的重要特征都可以用枚举来表达。由于 Mail 对象是随机创建的,想要减小一封邮件的 GeneralDelivery 被赋予 YES 的可能性,最简单的方法是创建更多的非 YES 的实例,因此枚举的定义一开始可能看起来有点好笑。

在 Mail 中,你会看到 randomMail() 方法,用来随机创建测试邮件。generator() 方法生成了一个 Iterator 对象,它使用 randomMail() 方法来生成一定数量的 Mail 对象,每通过迭代器调用一次 next() 就会生成一个。这种结构允许通过调用 Mail.generator() 方法实现 for-in 循环的简单创建能力。

PostOffice.java

import enums.TEST0003.Enums;

import java.util.Iterator;

class Mail {
    // The NO's reduce probability of random selection:
    enum GeneralDelivery {YES, NO1, NO2, NO3, NO4, NO5}

    enum Scannability {UNSCANNABLE, YES1, YES2, YES3, YES4}

    enum Readability {ILLEGIBLE, YES1, YES2, YES3, YES4}

    enum Address {INCORRECT, OK1, OK2, OK3, OK4, OK5, OK6}

    enum ReturnAddress {MISSING, OK1, OK2, OK3, OK4, OK5}

    GeneralDelivery generalDelivery;
    Scannability scannability;
    Readability readability;
    Address address;
    ReturnAddress returnAddress;
    static long counter = 0;
    long id = counter++;

    @Override
    public String toString() {
        return "Mail " + id;
    }

    public String details() {
        return toString() +
                ", General Delivery: " + generalDelivery +
                ", Address Scannability: " + scannability +
                ", Address Readability: " + readability +
                ", Address Address: " + address +
                ", Return address: " + returnAddress;
    }

    // Generate test Mail:
    public static Mail randomMail() {
        Mail m = new Mail();
        m.generalDelivery = Enums.random(GeneralDelivery.class);
        m.scannability = Enums.random(Scannability.class);
        m.readability = Enums.random(Readability.class);
        m.address = Enums.random(Address.class);
        m.returnAddress = Enums.random(ReturnAddress.class);
        return m;
    }

    public static Iterable<Mail> generator(final int count) {
        return new Iterable<Mail>() {
            int n = count;

            @Override
            public Iterator<Mail> iterator() {
                return new Iterator<Mail>() {
                    @Override
                    public boolean hasNext() {
                        return n-- > 0;
                    }

                    @Override
                    public Mail next() {
                        return randomMail();
                    }

                    @Override
                    public void remove() { // Not implemented
                        throw new UnsupportedOperationException();
                    }
                };
            }
        };
    }
}

public class PostOffice {
    enum MailHandler {
        GENERAL_DELIVERY {
            @Override
            boolean handle(Mail m) {
                switch (m.generalDelivery) {
                    case YES:
                        System.out.println("Using general delivery for " + m);
                        return true;
                    default:
                        return false;
                }
            }
        },
        MACHINE_SCAN {
            @Override
            boolean handle(Mail m) {
                switch (m.scannability) {
                    case UNSCANNABLE:
                        return false;
                    default:
                        switch (m.address) {
                            case INCORRECT:
                                return false;
                            default:
                                System.out.println("Delivering " + m + " automatically");
                                return true;
                        }
                }
            }
        },
        VISUAL_INSPECTION {
            @Override
            boolean handle(Mail m) {
                switch (m.readability) {
                    case ILLEGIBLE:
                        return false;
                    default:
                        switch (m.address) {
                            case INCORRECT:
                                return false;
                            default:
                                System.out.println("Delivering " + m + " normally");
                                return true;
                        }
                }
            }
        },
        RETURN_TO_SENDER {
            @Override
            boolean handle(Mail m) {
                switch (m.returnAddress) {
                    case MISSING:
                        return false;
                    default:
                        System.out.println("Returning " + m + " to sender");
                        return true;
                }
            }
        };

        abstract boolean handle(Mail m);
    }

    static void handle(Mail m) {
        for (MailHandler handler : MailHandler.values()) {
            if (handler.handle(m)) {
                return;
            }
        }
        System.out.println(m + " is a dead letter");
    }

    public static void main(String[] args) {
        for (Mail mail : Mail.generator(10)) {
            System.out.println(mail.details());
            handle(mail);
            System.out.println("*****");
        }
    }
}

运行结果如下:

在这里插入图片描述

职责链模式的作用体现在了 MailHandler枚举中,枚举的定义顺序则决定了各个策略在每封邮件上被应用的顺序。该模式会按顺序尝试应用每个策略,直到某个策略执行成功,或者全部策略都执行失败(即邮件无法投递)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/694300.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

魔兽世界自己架设私人服登录不了服务器

要在自己的计算机上架设魔兽世界私人服服务器需要进行如下步骤&#xff1a; 1. 下载和安装魔兽世界服务器文件 首先需要去官网下载和安装魔兽世界服务器文件并进行配置。这一步很关键&#xff0c;因为要确保服务器安装和配置正确&#xff0c;才能保证能够顺利地登录服务器。 …

怎么将pdf A3版转换为A4版

借助WPS进行分割(需开通会员) 步骤一&#xff1a;在WPS中打开PDF文件&#xff0c;点击菜单栏中的“编辑”——“分割页面”功能&#xff0c;进入分割界面&#xff0c;设置分割线的数量和位置&#xff0c;接着点击“立即分割”就能快速将PDF分割成两页了 步骤二&#xff1a;点击…

Flink-SQL 写入PostgreSQL 问题汇总

​ 1.主键字段为空问题 错误信息 org.apache.flink.table.api.TableException: Column bus_no is NOT NULL, however, a null value is being written into it. You can set job configuration table.exec.sink.not-null-enforcerDROP to suppress this exception and drop …

用Excel生成Sql:

用Excel生成Sql: 以如图为例&#xff1a;点击一行数据的后面一个单元格&#xff0c;在上面的fx部分输入&#xff0c;以等号开头证明这是一个公式。在等号的后面写上想要添加的数据&#xff0c;书写规范是这样&#xff1a;“&A2&”表示varchar类型&#xff1b;"&am…

你知道什么是生成对抗网络吗

生成对抗网络&#xff08;GANs&#xff09;是一种深度学习模型&#xff0c;已经显示出在许多生成相关任务中的卓越性能。最近几年&#xff0c;越来越多的研究人员将注意力集中于 GAN 的隐空间属性&#xff0c;并提出了许多利用这些属性进行语义图像编辑的方法。然而&#xff0c…

STM32CubeMX联合CLion开发环境搭建

STM32CubeMX联合CLion开发环境搭建 文章目录 STM32CubeMX联合CLion开发环境搭建1. STM32CubeMX与CLion简介1.1 STM32CubeMX1.2 HAL库1.3 CLion 2. 部署过程2.1 软件部署环境2.2 STM32CubeMX下载及安装2.2 OpenOCD下载与安装2.3 CLion设置 3. 第一个STM32项目 1. STM32CubeMX与C…

IntelliJ IDEA - 通过依赖名查找 Pom.xml 引入的源头坐标

问题描述 今天在新建项目的时候&#xff0c;发现一个注解&#xff08;JsonInclude&#xff09;不知道是哪个包的源头引入的&#xff0c;后来打开原来的老项目&#xff0c;查看对应的源文件&#xff0c;发现如图所示 但是这个 com.fasterxml.jackson.core:jackson-annotations:…

模型实战(13)之YOLOv8实现手语字母检测与识别+权重分享

YOLOv8实现手语字母检测与识别+权重分享 本文借助yolov8 实现手语字母的检测与识别:先检测手的ROI,进而对手语表达的字母含义进行识别全文将从环境搭建、模型训练及预测来展开对整个算法流程进行讲解文中给出了开源数据集链接及从 Roboflow 上的下载教程实现效果如下: 1. 环…

雪佛龙公司通过使用Liquid UI调动SAP EWM流程,在短短26天内将生产力提高了90%!

背景介绍 雪佛龙是一家美国跨国能源公司&#xff0c;最初被称为加州标准石油公司&#xff08;Socal&#xff09;。它的总部位于加利福尼亚州圣拉蒙&#xff0c;活跃于180多个国家。雪佛龙从事石油和天然气行业的各个方面&#xff0c;包括碳氢化合物勘探和生产;炼油、营销和运输…

【单片机】STM32单片机的矩阵键盘驱动,标准库,无阻塞方式的矩阵键盘读取

原理图&#xff1a; 从左到右、从上到下&#xff0c;按键是1到16&#xff0c;没有按键返回0&#xff1a; key.c #include "key.h"/* 按键初始化函数 */ void KEY_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, …

前端发送html字符串文本给后端,转PDF格式不正确

大无语事件&#xff0c;前端使用原始html table写出来在前端显示一直正确&#xff0c;但是一发给后端转PDF就失败&#xff08;如图&#xff09;。 想着是不是因为前端转义的问题&#xff0c;后来发现转不转的无所谓&#xff0c;然后发现后端本地转PDF也成功&#xff0c;但是通…

深入浅出设计模式 - 模板方法模式

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…

修复u盘怎么做?4步快速完成u盘修复!

我的u盘用了好多年了&#xff0c;里面存了很多重要的照片。但最近不知道为什么我的u盘出现了各种问题&#xff0c;大家有什么修复u盘的好方法吗&#xff1f;或者我应该怎么样才能恢复我U盘里的重要数据呢&#xff1f; U盘作为一个便捷的存储工具&#xff0c;为我们保存数据提供…

SpringBoot整合SpringSecurity

一、概述 1.1 Spring Security和Shiro Spring Security 是Spring家族中的一个安全管理框架。 相比与另外一个安全框架Shiro&#xff0c;它提供了更丰富的功能&#xff0c;社区资源也比Shiro丰富。 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。 小项目有Shi…

ChatGPT:开放AI平台的最新进展和功能

第一章&#xff1a;引言 在过去的几年中&#xff0c;人工智能技术取得了长足的发展&#xff0c;其在各个领域的应用也日益广泛。而在AI技术中&#xff0c;自然语言处理&#xff08;NLP&#xff09;一直是备受关注的领域之一。ChatGPT作为OpenAI的开放AI平台上的一项重要技术&am…

【Duilib】通过xml文件布局界面

环境 VS版本&#xff1a;VS2013 概述 上一篇 【Duilib】入门 &#xff0c;简单介绍了Duilib库的使用&#xff0c;这一篇测试一下通过xml布局界面。 步骤 1、创建工程 以 Win32\Win32项目 为模板创建TestByXml工程&#xff0c;步骤与上一篇基本一致。 2、创建MainWndFrame&a…

简单分享在微信上怎么实现分销功能

小程序分销开发怎么做&#xff1f;在如今的电商市场中&#xff0c;小程序分销成为了一种新兴的销售模式&#xff0c;通过分销模式&#xff0c;商家能够借助分销商的力量提高销售额&#xff0c;同时分销商也能不用投入大量资金和时间&#xff0c;就能在小程序上进行销售。那么&a…

FL Studio21中文版音频宿主软件下载教程

FL Studio是很适合新手上手的宿主软件&#xff0c;这得益于FL Studio独特的编曲逻辑。水果可以允许我们不使用音轨的思路来编曲。在FL Studio中我们创建一个pattern后&#xff0c;可以添加乐器或采样进去进行编写&#xff0c;编写完善后将Pattern拖进播放列表进行编排。不用区分…

高性能计算可以自学么?自学学完高性能计算能就业吗

随着超算互联网的认知越来越深&#xff0c;越来越多同学意识到高性能计算是未来有可能最好的就业方向之一。 高性能计算因其更偏底层、更不易被替代&#xff0c;因此广受广大大学生朋友和在职程序员的青睐。那么自学高性能计算可行吗&#xff1f;高性能计算可以自学吗&#xff…

2023年Java 毕业设计怎么选题,有哪些注意事项

个人简介&#xff1a;程序员徐师兄&#xff0c;7 年大厂程序员经历&#xff0c;擅长Java、微信小程序、Python、Android等&#xff0c;大家有这一块的问题可以一起交流&#xff01; 各类成品java毕设 。javaweb&#xff0c;ssh&#xff0c;ssm&#xff0c;springboot等等项目框…