设计模式--责任链模式

Java工程源码

类图

这里写图片描述


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


优点
- 将请求和处理分开,两者解耦,提高系统灵活性

缺点
- 性能问题 每个请求都是从链头遍历到链尾,链比较长时,存在性能问题
- 调试不方便 因为采用了递归的方式


扩展
责任链模式核心是 作为请求者不用知道到底是需要谁来处理的


处理等级

public class Level {
    // 定义一个请求和处理等级
    private int n;

    public Level(int _n) {
        this.n = _n;
    }

    public void setLevel(int _n) {
        this.n = _n;
    }

    public int getLevel() {
        return n;
    }
}

请求

public class Request {
    //处理等级
    private Level level;

    public Request(Level _level) {
        this.level = _level;
    }

    /**
     * 获取请求的等级
     */
    public Level getRequestLevel() {
        return level;
    }
}

应答

public class Response {
    private int n;

    public Response(int _n) {
        this.n = _n;
    }

    // 处理返回数据
    public void show() {
        System.out.println("我是响应 n:" + n);
    }
}

抽象处理者

public abstract class Handler {
    /**
     * 下一个处理者
     */
    private Handler nextHandler;

    /**
     * 处理请求
     *
     * @param request 请求
     * @return 响应结果
     */
    public final Response handleMessage(Request request) {
        Response response = null;
        // 如果级别相同,处理任务
        if (getHandlerLevel().equals(request.getRequestLevel())) {
            System.out.println("找到了处理者:处理者Level" + getHandlerLevel().getLevel());
            //开始处理任务
            response = echo(request);
        }
        // 如果级别不同,责任链还有下一个处理者
        else if (nextHandler != null) {
            System.out.println("当前处理者:处理者Level:" + getHandlerLevel().getLevel());
            System.out.println(" ->下一个处理者:处理者Level:" + nextHandler.getHandlerLevel().getLevel());
            // 让下一个处理者接收请求,并返回处理响应
            response = nextHandler.handleMessage(request);
        }
        return response;
    }

    /**
     * 设置下一个处理者是谁
     *
     * @param _handler 下一个处理者
     */
    public void setNext(Handler _handler) {
        this.nextHandler = _handler;
    }

    /**
     * 每一个处理者有一个处理级别
     *
     * @return 处理级别
     */
    protected abstract Level getHandlerLevel();

    /**
     * 每一个处理者必须实现处理任务
     *
     * @param request 处理请求
     * @return 处理响应
     */
    protected abstract Response echo(Request request);
}

具体处理者

public class ConcreteHandler extends Handler {
    private Level level;
    private Response response;

    public ConcreteHandler(Level _level, Response _response) {
        //设置自己的处理级别
        this.level = _level;
        this.response = _response;
    }

    @Override
    protected Level getHandlerLevel() {
        return level;
    }

    @Override
    protected Response echo(Request request) {
        // 完成处理逻辑
        System.out.println("处理者Level"
                + getHandlerLevel().getLevel() + "开始处理请求");
        System.out.println("完成处理逻辑 request.level="
                + request.getRequestLevel().getLevel());
        return response;
    }
}

场景类

public class Client {
    public static void main(String[] args) {
        Level l1 = new Level(1);
        Level l2 = new Level(2);
        Level l3 = new Level(3);
        Handler handler1 = new ConcreteHandler(l1, new Response(1));// 处理者1
        Handler handler2 = new ConcreteHandler(l2, new Response(2));// 处理者2
        Handler handler3 = new ConcreteHandler(l3, new Response(3));// 处理者3
        // 形成责任链
        handler1.setNext(handler2);
        handler2.setNext(handler3);
        // 执行责任链,获取响应,可以从不同的处理者开始找请求的处理等级
//        Response response = handler1.handleMessage(new Request(l1));
//        Response response = handler1.handleMessage(new Request(l2));
//        Response response = handler2.handleMessage(new Request(l3));
        Response response = handler1.handleMessage(new Request(l3));
        if (response != null) {
            response.show();
        } else {
            System.out.println("没有处理者处理请求");
        }
    }
}

运行结果

当前处理者:处理者Level:1
 ->下一个处理者:处理者Level:2
当前处理者:处理者Level:2
 ->下一个处理者:处理者Level:3
找到了处理者:处理者Level3
处理者Level3开始处理请求
完成处理逻辑 request.level=3
我是响应 n:3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值