Java设计模式之责任链模式的示例详解

Java设计模式之责任链模式的示例详解

什么是责任链模式

责任链模式是一种行为型设计模式,设计思路是将一个请求同一个处理的对象组成一条链,当请求在链上不断传递并处理直到被处理完毕。责任链模式可以避免请求的直接发起者和接受者之间的耦合关系,同时使得请求可以被多个对象依次进行处理。

如何实现责任链模式

责任链模式包含两个重要的角色:抽象处理者和具体处理者。抽象处理者定义请求处理的方法,并且持有指向下一个处理者的引用;具体处理者实现具体的请求处理逻辑,同时需要持有指向下一个处理者的引用。

当请求到达责任链的起始点时,会由第一个处理者进行处理,如果无法处理则将请求转发给下一个处理者,直到请求被处理完毕或者请求没有被任何处理者处理。

示例一:处理用户注册信息

下面的示例展示了如何使用责任链模式处理用户注册信息。

首先定义一个抽象处理者AbstractHandler

public abstract class AbstractHandler {

    protected AbstractHandler nextHandler;

    public void setNextHandler(AbstractHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    public abstract boolean handle(User user);
}

其中nextHandler指向下一个处理者,handle方法是具体的请求处理方法。

然后定义两个具体处理者NameCheckHandlerPhoneCheckHandler分别用于检查用户名和手机号的合法性:

public class NameCheckHandler extends AbstractHandler {

    @Override
    public boolean handle(User user) {
        if (user.getName() == null || user.getName().isEmpty()) {
            System.out.println("用户名不能为空!");
            return false;
        }
        if (nextHandler != null) {
            return nextHandler.handle(user);
        } else {
            return true;
        }
    }
}

public class PhoneCheckHandler extends AbstractHandler {

    @Override
    public boolean handle(User user) {
        if (user.getPhone() == null || user.getPhone().isEmpty()) {
            System.out.println("手机号不能为空!");
            return false;
        }
        if (nextHandler != null) {
            return nextHandler.handle(user);
        } else {
            return true;
        }
    }
}

最后定义一个用户类User

public class User {

    private String name;
    private String phone;

    public User(String name, String phone) {
        this.name = name;
        this.phone = phone;
    }

    public String getName() {
        return name;
    }

    public String getPhone() {
        return phone;
    }
}

使用上面的代码创建责任链并进行测试:

public class Test {

    public static void main(String[] args) {
        AbstractHandler nameCheckHandler = new NameCheckHandler();
        AbstractHandler phoneCheckHandler = new PhoneCheckHandler();
        nameCheckHandler.setNextHandler(phoneCheckHandler);

        User user1 = new User(null, "12345678901");
        User user2 = new User("", "12345678901");
        User user3 = new User("张三", null);
        User user4 = new User("张三", "123");
        User user5 = new User("张三", "12345678901");
        nameCheckHandler.handle(user1);
        nameCheckHandler.handle(user2);
        nameCheckHandler.handle(user3);
        nameCheckHandler.handle(user4);
        nameCheckHandler.handle(user5);
    }
}

输出结果为:

用户名不能为空!
手机号不能为空!
手机号不能为空!
手机号不合法!

示例二:处理聚合支付

下面的示例展示了如何使用责任链模式处理聚合支付。

首先定义一个抽象处理者PayHandler

public abstract class PayHandler {

    protected PayHandler nextHandler;

    public void setNextHandler(PayHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    public abstract boolean pay(String orderId, double amount);
}

其中nextHandler指向下一个处理者,pay方法是具体的支付方法。

然后定义三个具体处理者AliPayHandlerWechatPayHandlerUnionPayHandler分别用于处理不同的支付方式:

public class AliPayHandler extends PayHandler {

    @Override
    public boolean pay(String orderId, double amount) {
        System.out.println("使用支付宝支付 " + amount + " 元!");
        if (nextHandler != null) {
            return nextHandler.pay(orderId, amount);
        } else {
            return true;
        }
    }
}

public class WechatPayHandler extends PayHandler {

    @Override
    public boolean pay(String orderId, double amount) {
        System.out.println("使用微信支付 " + amount + " 元!");
        if (nextHandler != null) {
            return nextHandler.pay(orderId, amount);
        } else {
            return true;
        }
    }
}

public class UnionPayHandler extends PayHandler {

    @Override
    public boolean pay(String orderId, double amount) {
        System.out.println("使用银联支付 " + amount + " 元!");
        if (nextHandler != null) {
            return nextHandler.pay(orderId, amount);
        } else {
            return true;
        }
    }
}

最后定义一个支付类Pay

public class Pay {

    private PayHandler payHandler;

    public Pay() {
        PayHandler aliPayHandler = new AliPayHandler();
        PayHandler wechatPayHandler = new WechatPayHandler();
        PayHandler unionPayHandler = new UnionPayHandler();
        aliPayHandler.setNextHandler(wechatPayHandler);
        wechatPayHandler.setNextHandler(unionPayHandler);
        this.payHandler = aliPayHandler;
    }

    public boolean pay(String orderId, double amount) {
        return payHandler.pay(orderId, amount);
    }
}

使用上面的代码创建支付对象并进行测试:

public class Test {

    public static void main(String[] args) {
        Pay pay = new Pay();
        pay.pay("order_001", 100);
    }
}

输出结果为:

使用支付宝支付 100.0 元!
使用微信支付 100.0 元!
使用银联支付 100.0 元!

总结

责任链模式可以有效地将请求的发起者和接受者解耦,同时也提高了系统的灵活性和可扩展性。在实际项目中,可以根据实际需求选择不同的责任链模式实现,以应对不同的情况和需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java设计模式之责任链模式的示例详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 浅谈ES6新增的数组方法和对象

    当我们使用JavaScript进行编程时,使用数组和对象是一种非常常见的方式。ES6提供了许多新的特性来帮助我们更轻松地管理和操作这些数据结构。本文将简要介绍ES6中新增的一些数组方法和对象的一些有用操作。 ES6新增的数组方法 Array.from() Array.from()方法接受一个类数组对象或可遍历对象,并返回一个真正的数组。这个新数组由传入的对象…

    other 2023年6月25日
    00
  • python重用父类功能的两种方式实例详解

    标题:Python重用父类功能的两种方式实例详解 简介 在面向对象编程中,子类可以继承父类的属性和方法,但有时候我们需要在子类中重用父类的方法。接下来,我们将学习如何在Python中实现这个功能,并且将介绍两种不同的方法,分别是继承和组合。 方法一:继承 在继承中,子类可以继承父类的属性和方法,并且可以在子类中重构那些需要修改的方法。这就是Python中实现…

    other 2023年6月26日
    00
  • #define中 #与##用法

    Define中 #与##用法 在C/C++编程语言中,#define是一种用来定义预处理宏的关键字。#define语句中的#符号和##符号在预处理宏定义中扮演着重要的角色。 #符号 在#define语句中,#符号用来将宏参数转化成一个字符串。假设我们有一个预处理宏MESSAGE,它接收一个参数,并将这个参数的值转化为一个字符串。下面是一个使用#符号的例子: …

    其他 2023年3月28日
    00
  • 测试webservice接口工具

    测试webservice接口工具 在开发Web应用程序的过程中,我们经常需要使用WebService接口来实现与其他系统的数据交互,而在开发和测试阶段,我们需要使用一些工具来测试这些接口是否可靠。在本文中,我将介绍几个常用的测试WebService接口的工具。 SoapUI SoapUI是一个功能强大的开源工具,可以用于创建和测试Web服务。它支持多种协议(…

    其他 2023年3月28日
    00
  • js判断ie版本号的简单实现代码

    当需要在JavaScript中判断Internet Explorer(IE)的版本号时,可以使用以下简单的实现代码: // 判断IE版本号的函数 function getIEVersion() { var userAgent = window.navigator.userAgent; var msie = userAgent.indexOf(‘MSIE ‘)…

    other 2023年8月3日
    00
  • Android 获取系统各个目录的方法

    获取系统各个目录是Android开发中的一项重要基础技能。以下是获取Android系统各个目录的方法攻略: 1. 获取应用程序目录 在Android应用程序中,每个应用程序都有自己的私有目录,也就是手机内存中/data/data/包名/目录,这个目录可以用来存放应用程序的私有数据和缓存数据。 方法1 可以通过getFilesDir()方法来获取当前应用程序的…

    other 2023年6月28日
    00
  • 魔兽世界wlk怀旧服鸟德堆什么属性 鸟德属性优先级选择推荐

    魔兽世界WLK怀旧服鸟德堆什么属性 在魔兽世界怀旧服中,如果你选择扮演鸟德这个职业,想要在战斗中表现出色,那么你需要关注以下几个属性:精通、急速、暴击等,下面我将详细讲解。 属性说明 精通 精通是鸟德最为重要的属性之一,因为它可以提升你的宠物造成的伤害和你的治疗效果。一般来说,你需要将大部分的装备属性都分配给精通,甚至可以牺牲一些暴击和急速来提高精通。 急速…

    other 2023年6月27日
    00
  • 新手如何正确使用CLion之输出hello world

    下面是关于使用CLion输出hello world的完整攻略,包括环境搭建、代码编写和两个示例说明。 环境搭建 下载安装CLion: 首先,需要从JetBrains官网下载并安装CLion。安装过程中,可以选择安装CMake和编译器。 创建新项目: 打开CLion,选择“Create New Project”,选择“C++ Executable”,然后选择项…

    other 2023年5月6日
    00
合作推广
合作推广
分享本页
返回顶部