设计模式-责任链模式的用法和使用场景分析

什么是链?

1、链是一系列节点的集合。

2.、链的各节点可灵活拆分再重组。

责任链模式(职责链)

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,

将这个对象连成一条链,并沿着这条链传递该请求,直到处理完成。

角色

抽象处理者角色(Handler):定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。

具体处理者角色(ConcreteHandler):具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

抽象处理者角色

一个抽象类

package mrzhang.design.chain;

import java.util.Map;

/**
 * @author zhangnianlei
 * @date 2020/8/30
 */
public abstract class Hander {
    
    protected Hander successor = null;

    public Hander getSuccessor() {
        return successor;
    }

    public void setSuccessor(Hander successor) {
        this.successor = successor;
    }
    
    public abstract Map<String, Object> handFeeRequest(Map<String, Object> param);
    
}

具体处理者

抽象类的实现类1

package mrzhang.design.chain;

import java.util.Map;

/**
 * @author zhangnianlei
 * @date 2020/8/31
 */
public class CheckHander extends Hander {
    @Override
    public Map<String, Object> handFeeRequest(Map<String, Object> param) {
        System.out.println("检查必填字段合法性");
        if (getSuccessor() != null) {
            return getSuccessor().handFeeRequest(param);
        }
        return null;
    }
}

实现类2

package mrzhang.design.chain;

import java.util.Map;

/**
 * @author zhangnianlei
 * @date 2020/8/31
 */
public class VerifyBusinessLogicHander extends Hander {
    @Override
    public Map<String, Object> handFeeRequest(Map<String, Object> param) {
        System.out.println("检查业务逻辑");
        if (getSuccessor() != null) {
            return getSuccessor().handFeeRequest(param);
        }
        return null;
    }
}

实现类3

package mrzhang.design.chain;

import java.util.Map;

/**
 * @author zhangnianlei
 * @date 2020/8/31
 */
public class ImportHander extends Hander {
    @Override
    public Map<String, Object> handFeeRequest(Map<String, Object> param) {
        System.out.println("导入数据");
        if (getSuccessor() != null) {
            return getSuccessor().handFeeRequest(param);
        }
        return null;
    }
}

客户端类

构建一个链,然后使用该链处理请求

package mrzhang.design.chain;

/**
 * @author zhangnianlei
 * @date 2020/8/31
 */
public class Client {

    public static void main(String[] args) {
        // 构建各个角色
        Hander h1 = new ImportHander();
        Hander h2 = new VerifyBusinessLogicHander();
        Hander h3 = new CheckHander();

        // 将各个角色连接起来形成一条责任链
        h3.setSuccessor(h2);
        h2.setSuccessor(h1);
        
        // 使用该责任链处理一条数据
        h3.handFeeRequest(null);
    }
}

责任链的使用场景

非常复杂的处理逻辑。

例如:新用户注册需要5个检查步骤

  1. 字段的合法性效验:验证用户的电话号码是否合法,邮箱是否合法,用户名是否合法,密码是否符合规则。
  2. 验证手机是否存在

如果将这5个步骤都放在一个方法中,代码维护将会很混乱

此时可以将这5个步骤每一个步骤都写在一个单独的Hander实现类中,将实现类串接成一个责任链。

责任链的好处

  1. 通过行为型模式,可以更加清晰地划分类与对象的职责(单一职责原则)。
  2. 当需要改动某一步骤的逻辑时,只需改动该节点的实现类。
  3. 当需要增加新的步骤时,只需新增一个Hander的实现类,然后在将该节点添加到调用链中(符合开闭原则,面向新增开放,面向修改关闭)。
  4. 当需要删除一个步骤时,只需在调用链中删除对应的节点即可。

猜你喜欢

转载自blog.csdn.net/Mr_Zhang____/article/details/108338840
今日推荐