责任链模式的简单实现

小A出差一趟花费近5万元,回来上班第一天就向组长申请报销费用,组长一看是笔不小的数目,他没有权限审批,于是组长就拿着票据去找部门主管,主管一看要报这么多钱,自己权限内只能批五千以下的费用,这完全超出了自己的权限范围.于是主管又跑去找经理,经理一看二话不说直接拿着票据奔向了老板的办公室,因为他也只能一万以下的费用。类似的情况对上班族来说肯定并不少见,上面的这个情景其实就是一个责任链的小例子,每一个人,准确地说是每一类人代表这条链上的一个节点,小民是请求的发起者,而老板则是处于链条顶端的类,小A从链的底端开始发出一个申请报账的请求,首先由组长处理该请求,组长比对后发现自己权限不够于是将该请求转发给位经理,而经理又基于同样的原因将请求转发给老板,,这样层层转达直至请求被处理,从中大家可以看到一个显而易见的事,就是至始至终小A只与组长产生关联,后面由谁处理票据,小A并不关心,唯一在乎的是报账的结果,责任链模式在这里很好的将请求的发起者与处理者解耦,。如果我们在代码中模拟这个过程也是很直观的,首先还是先声明一个抽象的领导类。

//抽象领导者
public abstract class Leader {//上一级领导处理者
    protected Leader nextHandler;

    public final void handleRequest(int money) {
        if (money <= limit()) {
            handle(money);
        } else {
            if (null != nextHandler) {
                nextHandler.handleRequest(money);
            }
        }
    }

    //自己能处理的额度限制
    protected abstract int limit();

    //处理报账
    protected abstract void handle(int money);
}

在这个抽象的领导类中只做了两件事,一是定义了两个抽象接口方法来确定一个领导者应有的行为和属性,二是声明了一个处理报账请求的方法来确定当前领导是否有能为处理报账请求。如果没有这权限,则将该请求转发给上级领导处理。接下来则是各个领导类的实现。
//各个具体领导者
public class Groupteader extends Leader {
    @Override
    protected int limit() {
        return 1000;
    }

    @Override
    protected void handle(int money) {
        System.out.println("组长处理报销" + money);
    }
}

public class Director extends Leader {
    @Override
    protected int limit() {
        return 5000;
    }

    @Override
    protected void handle(int money) {
        System.out.println("主管处理报销" + money);
    }
}

public class Manager extends Leader {
    @Override
    protected int limit() {
        return 10000;
    }

    @Override
    protected void handle(int money) {
        System.out.println("经理处理报销" + money);
    }
}

public class Boss extends Leader {
    @Override
    protected int limit() {
        return Integer.MAX_VALUE;
    }

    @Override
    protected void handle(int money) {
        System.out.println("老板处理报销" + money);
    }
}
//客户端小A
public class XiaoA {
    public static void main(String[] args) {
        //构建各领导类
        Groupteader groupteader = new Groupteader();
        Director director = new Director();
        Manager manager = new Manager();
        Boss boss = new Boss();
        groupteader.nextHandler = director;
        director.nextHandler = manager;
        manager.nextHandler = boss;
        //发起报账请求
        groupteader.handleRequest(50000);
    }
}

这里大家可能会想,可不可以直接越过组长找主管报账呢?答案是肯定的,这也是责任链模式的灵活之处,请求的发起可以从责任链的任何一个节点处开始,同时也可以改变责任链内部传递的规则,如主管不在,我们完全可以跨过主管从组长直接将请求转送给经理。对于责任链中的一个处理者对象,其只有两个行为,一是处理请求,二是将请求转送给下一个节点,不允许某个处理者对象在处理了请求后又将请求转送给上一个节点的情况。对于一条责任链来说,一个请求最终只有两种情况,一是被某个处理对象所处理,另一个是所有对象均未对其处理,对于前一种情况我们称该责任链为纯的责任链,对于后一种情况我们称为不纯的责任链,在实际应用中,我们所见到的责任链模式大多为不纯的责任链。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
探索全栈前端技术的魅力:HTML+CSS+JS+JQ+Bootstrap网站源码深度解析 在这个数字化时代,构建一个既美观又功能强大的网站成为了许多开发者和企业追逐的目标。本份资源精心汇集了一套完整网站源码,融合了HTML的骨架搭建、CSS的视觉美化、JavaScript的交互逻辑、jQuery的高效操作以及Bootstrap的响应式设计,全方位揭秘了现代网页开发的精髓。 HTML,作为网页的基础,它构建了信息的框架;CSS则赋予网页生动的外观,让设计创意跃然屏上;JavaScript的加入,使网站拥有了灵动的交互体验;jQuery,作为JavaScript的强力辅助,简化了DOM操作与事件处理,让编码更为高效;而Bootstrap的融入,则确保了网站在不同设备上的完美呈现,响应式设计让访问无界限。 通过这份源码,你将: 学习如何高效组织HTML结构,提升页面加载速度与SEO友好度; 掌握CSS高级技巧,如Flexbox与Grid布局,打造适应各种屏幕的视觉盛宴; 理解JavaScript核心概念,动手实现动画、表单验证等动态效果; 利用jQuery插件快速增强用户体验,实现滑动效果、Ajax请求等; 深入Bootstrap框架,掌握移动优先的开发策略,响应式设计信手拈来。 无论是前端开发新手渴望系统学习,还是资深开发者寻求灵感与实用技巧,这份资源都是不可多得的宝藏。立即深入了解,开启你的全栈前端探索之旅,让每一个网页都成为技术与艺术的完美融合!
探索全栈前端技术的魅力:HTML+CSS+JS+JQ+Bootstrap网站源码深度解析 在这个数字化时代,构建一个既美观又功能强大的网站成为了许多开发者和企业追逐的目标。本份资源精心汇集了一套完整网站源码,融合了HTML的骨架搭建、CSS的视觉美化、JavaScript的交互逻辑、jQuery的高效操作以及Bootstrap的响应式设计,全方位揭秘了现代网页开发的精髓。 HTML,作为网页的基础,它构建了信息的框架;CSS则赋予网页生动的外观,让设计创意跃然屏上;JavaScript的加入,使网站拥有了灵动的交互体验;jQuery,作为JavaScript的强力辅助,简化了DOM操作与事件处理,让编码更为高效;而Bootstrap的融入,则确保了网站在不同设备上的完美呈现,响应式设计让访问无界限。 通过这份源码,你将: 学习如何高效组织HTML结构,提升页面加载速度与SEO友好度; 掌握CSS高级技巧,如Flexbox与Grid布局,打造适应各种屏幕的视觉盛宴; 理解JavaScript核心概念,动手实现动画、表单验证等动态效果; 利用jQuery插件快速增强用户体验,实现滑动效果、Ajax请求等; 深入Bootstrap框架,掌握移动优先的开发策略,响应式设计信手拈来。 无论是前端开发新手渴望系统学习,还是资深开发者寻求灵感与实用技巧,这份资源都是不可多得的宝藏。立即深入了解,开启你的全栈前端探索之旅,让每一个网页都成为技术与艺术的完美融合!
责任链模式可以用于实现登录验证,它可以将验证逻辑拆分成多个独立的步骤,并将这些步骤组织成一个链,每个步骤都可以决定是否继续往下执行,或者直接返回验证失败。 在实现登录验证时,可以按照以下步骤构建责任链: 1. 创建一个抽象处理器类,定义一个处理请求的抽象方法,以及一个设置下一个处理器的方法。 2. 创建多个具体处理器类,实现抽象处理器类的抽象方法,并在其中实现不同的验证逻辑。 3. 将这些具体处理器按照顺序组织成一个链,将它们的下一个处理器设置为链中的下一个处理器。 4. 在客户端代码中,创建一个链的入口处理器,并将请求发送给它进行处理。 下面是一个简单的示例代码: ```java // 抽象处理器 abstract class LoginHandler { protected LoginHandler nextHandler; public void setNextHandler(LoginHandler nextHandler) { this.nextHandler = nextHandler; } public abstract boolean handle(LoginRequest request); } // 具体处理器 class UsernameHandler extends LoginHandler { public boolean handle(LoginRequest request) { if (request.getUsername() == null || request.getUsername().isEmpty()) { return false; } if (nextHandler != null) { return nextHandler.handle(request); } return true; } } class PasswordHandler extends LoginHandler { public boolean handle(LoginRequest request) { if (request.getPassword() == null || request.getPassword().isEmpty()) { return false; } if (nextHandler != null) { return nextHandler.handle(request); } return true; } } class CaptchaHandler extends LoginHandler { public boolean handle(LoginRequest request) { if (request.getCaptcha() == null || request.getCaptcha().isEmpty()) { return false; } if (nextHandler != null) { return nextHandler.handle(request); } return true; } } // 客户端代码 public class LoginValidator { private LoginHandler handler; public LoginValidator() { // 构建责任链 handler = new UsernameHandler(); handler.setNextHandler(new PasswordHandler()); handler.getNextHandler().setNextHandler(new CaptchaHandler()); } public boolean validate(LoginRequest request) { return handler.handle(request); } } // 登录请求 class LoginRequest { private String username; private String password; private String captcha; // 省略构造函数和getter/setter方法 } ``` 在这个示例代码中,抽象处理器 LoginHandler 定义了处理请求的抽象方法 handle(),并提供了设置下一个处理器的方法 setNextHandler()。具体处理器 UsernameHandler、PasswordHandler 和 CaptchaHandler 都继承了 LoginHandler 并实现了 handle() 方法,在其中实现了不同的验证逻辑,并在需要时调用下一个处理器的 handle() 方法。在客户端代码中,创建一个 LoginValidator 类,它构建了一个责任链,并提供了一个 validate() 方法,将登录请求传递给链的入口处理器进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值