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日

相关文章

  • jmeter设置全局变量与正则表达式提取器过程图解

    JMeter设置全局变量与正则表达式提取器过程图解攻略 JMeter是一款功能强大的性能测试工具,可以模拟多种负载情况对目标系统进行测试。在测试过程中,我们经常需要设置全局变量和使用正则表达式提取器来提取目标系统返回的数据。下面是详细的攻略,包含了设置全局变量和使用正则表达式提取器的过程图解。 设置全局变量 全局变量可以在整个测试计划中使用,方便在不同的线程…

    other 2023年7月29日
    00
  • SpringFactoriesLoader类作用详解

    SpringFactoriesLoader类作用详解 1. 简介 SpringFactoriesLoader是Spring框架中的一个工具类,用于加载在META-INF/spring.factories文件中定义的工厂类。它可以帮助开发者更方便地扩展Spring框架,并提供了一种可插拔的机制,使得系统的功能可以通过配置来动态决定。 2. 加载过程 Sprin…

    other 2023年6月28日
    00
  • dos命令for用法详解

    DOS命令FOR用法详解 在DOS命令中,使用FOR命令可以进行循环操作。本文将详细讲解FOR命令的用法,以及两个使用示例。 常见的FOR参数及用法 下面是常见的FOR参数及其用法: 1. FOR /F参数 FOR /F参数可以从文件中读取文本,并且可以按照指定的分隔符和固定的位置提取文本中的数据。语法如下: FOR /F ["options&qu…

    other 2023年6月26日
    00
  • 易语言使用动画框做消除游戏的代码

    易语言使用动画框做消除游戏的代码攻略 1. 创建动画框和游戏界面 首先,我们需要创建一个动画框和游戏界面。在易语言中,可以使用创建动画框和创建窗口函数来实现。 创建动画框(1, 0, 0, 800, 600, \"消除游戏\") 创建窗口(1, 0, 0, 800, 600, \"消除游戏\") 2. 绘制游戏元素 接…

    other 2023年7月29日
    00
  • 魔兽世界wlk怀旧服血dk堆什么属性 血dk属性优先级选择攻略

    魔兽世界WLK怀旧服血DK堆什么属性 在魔兽世界怀旧服过程中,血死骑(Blood DK)是一个强大的职业,但是正确选择属性是关键。怎么根据不同的游戏阶段,来合理地分配血死骑的属性呢?本文将为大家提供一些帮助。 1. 前期游戏阶段 在游戏的前期阶段,血死骑最需要的是耐力、武器伤害、爆击等属性。在出现危险时,血死骑需要有足够的生命值,以保证自己能够或多或少的经受…

    other 2023年6月27日
    00
  • PHP中的Trait 特性及作用

    PHP中的Trait 特性及作用 什么是Trait Trait是PHP中一种代码复用机制,它允许开发者在不使用继承的情况下,将方法集合应用到一个类中。Trait可以被多个类使用,提供了一种解决多继承问题的方式。 Trait的作用 Trait的主要作用是解决PHP单继承的限制,它可以在不引入多继承的复杂性的情况下,实现代码的复用。Trait可以定义一组方法,然…

    other 2023年7月28日
    00
  • Python全栈之作用域和闭包

    Python全栈之作用域和闭包攻略 作用域(Scope) 在Python中,作用域是指变量的可访问性和可见性范围。Python中有三种作用域:全局作用域、局部作用域和内建作用域。 全局作用域 全局作用域是在整个程序中都可访问的作用域。在全局作用域中定义的变量可以在程序的任何地方使用。 x = 10 # 全局变量 def foo(): print(x) # 可…

    other 2023年7月28日
    00
  • matlab中newff函数旧版用法

    matlab中newff函数旧版用法 在matlab中,使用神经网络进行数据处理时,常常需要使用newff函数创建一个神经网络对象。newff的函数用法有多个版本,由于官方文档对于旧版本的描述方式很少,且新版本功能已经趋于完善,导致许多新手看官文档时会遇到困惑。本文旨在提供一种旧版newff函数的用法,以供了解和参考。 1. newff函数的语法 newff…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部