责任链模式详解附有代码案例分析(包含责任链模式与建造者模式的结合代码案例)

责任链模式

一、责任链模式的概念与角色

(一)、责任链模式的概念

​ 责任链模式是将链中每一个节点看作是一个对象,每个节点处理的请求均不同,且内部自动维护一个下一节点对象。当一个请求从链式的首端发出时,会沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止。属于行为型模式。

​ 责任链模式使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

​ 责任链模式得本质是解耦请求和处理,让请求在处理链中能进行传递与被处理。理解责任链模式应该理解其模式,而不是其具体实现。责任链模式将节点处理者组合成了链式结构,并允许节点自身决定是否进行请求处理或转发,相当于让请求流动了起来。

(二)、责任链模式的角色

​ 1、抽象处理者(Handler):定义一个请求处理的方法,并维护一个下一个处理节点Handler对象的引用。

​ 2、具体处理者(ConcreteHandler):对请求进行处理,如果不感兴趣,则进行转发。

二、责任链模式的应用场景

​ 1、多个对象可以处理同一个请求,但具体由哪个对象处理则在运行时动态决定。

​ 2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

​ 3、可动态指定一组对象处理请求。

三、无使用责任链模式的代码示例

Member:

public class Member {

    private String loginName;
    private String loginPass;
    private String roleName;

    public Member(String loginName, String loginPass) {
        this.loginName = loginName;
        this.loginPass = loginPass;
    }

    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    public String getLoginPass() {
        return loginPass;
    }

    public void setLoginPass(String loginPass) {
        this.loginPass = loginPass;
    }

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    @Override
    public String toString() {
        return "Member{" +
                "loginName='" + loginName + '\'' +
                ", loginPass='" + loginPass + '\'' +
                ", roleName='" + roleName + '\'' +
                '}';
    }
}

MemberService:

public class MemberService {

    public void login(String loginName, String loginPass) {
        if (loginName.isEmpty() || loginPass.isEmpty()) {
            System.out.println("用户名与密码不可为空");
            return;
        }
        System.out.println("用户名和密码不为空,可进行下一步");

        Member member = checkExists(loginName, loginPass);
        if (null == member) {
            System.out.println("用户不存在");
            return;
        }
        System.out.println("登录成功");

        if (!"管理员".equals(member.getRoleName())) {
            System.out.println("您不是管理员,无操作权限");
            return;
        }
        System.out.println("您是管理员,允许操作");
    }

    private Member checkExists(String loginName, String loginPass) {
        Member member = new Member(loginName, loginPass);
        member.setRoleName("管理员");
        return member;
    }
}

测试类:

public class Test {
    public static void main(String[] args) {
        MemberService memberService = new MemberService();
        memberService.login("huang", "123");
    }
}

四、使用责任链模式的代码示例

Member:

public class Member {

    private String loginName;
    private String loginPass;
    private String roleName;

    public Member(String loginName, String loginPass) {
        this.loginName = loginName;
        this.loginPass = loginPass;
    }

    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    public String getLoginPass() {
        return loginPass;
    }

    public void setLoginPass(String loginPass) {
        this.loginPass = loginPass;
    }

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    @Override
    public String toString() {
        return "Member{" +
                "loginName='" + loginName + '\'' +
                ", loginPass='" + loginPass + '\'' +
                ", roleName='" + roleName + '\'' +
                '}';
    }
}

Handler:

public abstract class Handler {

    protected Handler chain;

    public void next(Handler handler) {
        this.chain = handler;
    }

    public abstract void doHandler(Member member);
}

ValidateHandler:

public class ValidateHandler extends Handler {
    @Override
    public void doHandler(Member member) {
        if (member.getLoginName().isEmpty() || member.getLoginPass().isEmpty()) {
            System.out.println("用户名或密码为空");
            return;
        }
        System.out.println("用户名与密码不为空,可进行下一步");
        chain.doHandler(member);
    }
}

LoginHandler:

public class LoginHandler extends Handler {
    @Override
    public void doHandler(Member member) {
        System.out.println("登录成功");
        member.setRoleName("管理员");
        chain.doHandler(member);
    }
}

AuthHandler:

public class AuthHandler extends Handler{
    @Override
    public void doHandler(Member member) {
        if (!"管理员".equals(member.getRoleName())){
            System.out.println("您不是管理员,无操作权限");
            return;
        }
        System.out.println("您是管理员,允许操作");
    }
}

MemberService:

public class MemberService {

    public void login(String loginName, String loginPass) {
        Handler validateHandler = new ValidateHandler();
        Handler loginHandler = new LoginHandler();
        Handler authHandler = new AuthHandler();

        validateHandler.next(loginHandler);
        loginHandler.next(authHandler);

        validateHandler.doHandler(new Member(loginName, loginPass));
    }
}

测试类:

public class Test {
    public static void main(String[] args) {
        MemberService memberService = new MemberService();
        memberService.login("huang", "123");
    }
}

五、责任链模式与建造者模式的结合

Handler:

public abstract class Handler<T> {

    protected Handler chain;

    public void next(Handler handler) {
        this.chain = handler;
    }

    public abstract void doHandler(Member member);

    public static class Builder<T> {
        private Handler<T> head;
        private Handler<T> tail;

        public Builder<T> addHandler(Handler<T> handler) {
            if (this.head == null) {
                this.head = this.tail = handler;
                return this;
            }
            this.tail.next(handler);
            this.tail = handler;

            return this;
        }

        public Handler<T> build() {
            return this.head;
        }

    }
}

MemberService:

public class MemberService {

    public void login(String loginName, String loginPass) {
        Handler.Builder builder = new Handler.Builder();
        Handler.Builder builder1 = builder.addHandler(new ValidateHandler())
                .addHandler(new LoginHandler())
                .addHandler(new AuthHandler());

        builder.build().doHandler(new Member(loginName, loginPass));
    }
}

六、责任链模式的优缺点

(一)、责任链模式的优点

​ 1、将请求与处理解耦

​ 2、请求处理者(节点对象)只需关注自己感兴趣的请求进行处理即可,对于不感兴趣的请求,直接转发给下一级节点对象。

​ 3、具备链式传递处理请求功能,请求发送者无需知晓链路结构,只需等待请求处理结果。

​ 4、链路结构灵活,可以改变链路结果动态地新增或删减责任。

​ 5、易于扩展新的请求处理类(节点),符合开闭原则。

(二)、责任链模式的缺点

​ 1、责任链太长或者处理时间过长,会影响整体性能。

​ 2、如果节点对象存在循环引用,会造成死循环,导致系统崩溃。

七、设计模式的相关博客文章链接

1、七大设计原则的简单解释(包含合成复用原则),简单理解、快速入门,具备案例代码

链接: 七大设计原则的简单解释(包含合成复用原则),简单理解、快速入门,具备案例代码.

2、工厂模式详解附有代码案例分析(简单工厂,工厂方法,抽象工厂)

链接: 工厂模式详解附有代码案例分析(简单工厂,工厂方法,抽象工厂).

3、单例模式详解及代码案例与应用场景(饿汉式单例模式、懒汉式单例模式、注册式单例模式)

链接: 单例模式详解及代码案例与应用场景(饿汉式单例模式、懒汉式单例模式、注册式单例模式).

4、原型模式详解附有代码案例分析(浅克隆和深克隆的相关解析)

链接: 原型模式详解附有代码案例分析(浅克隆和深克隆的相关解析).

5、建造者模式详解附有代码案例分析(包含建造者模式与工厂模式的区别分析)

链接: 建造者模式详解附有代码案例分析(包含建造者模式与工厂模式的区别分析).

6、门面模式详解附有代码案例分析

链接: 门面模式详解附有代码案例分析.

7、装饰者模式详解附有代码案例分析

链接: 装饰者模式详解附有代码案例分析.

8、享元模式详解附有代码案例分析(包含享元模式的源码应用分析——String中的享元模式应用、Integer中的享元模式应用)

链接: 享元模式详解附有代码案例分析(包含享元模式的源码应用分析——String中的享元模式应用、Integer中的享元模式应用).

9、组合模式详解附有代码案例分析(包含透明组合模式、安全组合模式的代码示例)

链接: 组合模式详解附有代码案例分析(包含透明组合模式、安全组合模式的代码示例).

10、桥接模式详解附有代码案例分析

链接: 桥接模式详解附有代码案例分析.

11、适配器模式详解附有代码案例分析(包含类适配器、对象适配器以及接口适配器的代码示例)

链接: 适配器模式详解附有代码案例分析(包含类适配器、对象适配器以及接口适配器的代码示例).

12、委派模式详解附有代码案例分析(包含委派模式在JDK中的源码示例解析)

链接: 委派模式详解附有代码案例分析(包含委派模式在JDK中的源码示例解析).

13、模板方法模式详解附有代码案例分析(包含模板方法模式重构JDBC操作业务代码示例)

链接: 模板方法模式详解附有代码案例分析(包含模板方法模式重构JDBC操作业务代码示例).

14、策略模式详解附有代码案例分析(包含策略模式在源码中的应用以及代码示例)

链接: 策略模式详解附有代码案例分析(包含策略模式在源码中的应用以及代码示例).

15、责任链模式详解附有代码案例分析(包含责任链模式与建造者模式的结合代码案例)

链接: 责任链模式详解附有代码案例分析(包含责任链模式与建造者模式的结合代码案例).

16、迭代器模式详解附有代码案例分析(包含迭代器模式的源码应用分析)

链接: 迭代器模式详解附有代码案例分析(包含迭代器模式的源码应用分析).

17、命令模式详解附有代码案例分析(包含命令模式的源码应用分析)

链接: 命令模式详解附有代码案例分析(包含命令模式的源码应用分析).

18、状态模式详解附有代码案例分析(包含状态模式与其他相关设计模式的对比)

链接: 状态模式详解附有代码案例分析(包含状态模式与其他相关设计模式的对比).

19、备忘录模式详解附有代码案例分析

链接: 备忘录模式详解附有代码案例分析.

20、中介者模式详解附有代码案例分析

链接: 中介者模式详解附有代码案例分析.

21、解释器模式详解附有代码案例分析

链接: 解释器模式详解附有代码案例分析.

22、观察者模式详解附有代码案例分析(包含观察者模式使用JDK方式实现)

链接: 观察者模式详解附有代码案例分析(包含观察者模式使用JDK方式实现).

23、访问者模式详解附有代码案例分析

链接: 访问者模式详解附有代码案例分析.

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值