传统责任链模式和变种责任链模式

一、传统责任链模式

传统责任链模式是事件在链条中的某一节进行处理,而变种责任链模式是事件会在链条的每一节都进行处理,每一节担当的责任各不相同。

1.一个接口或抽象类

定义一个接口,一个方法,判断数值是否正确。这里简单的自定义判断数值是否正确,规则随便怎么写。

package com.ykq;

/**
 * 数值处理接口类
 */
public interface NumInf {
    /**
     * 检查数值是否正确
     *
     * @param num int
     * @return boolean
     */
    public boolean checkNumCurrent(int num);
}
2.多个实现类

多个实现类都实现上面的接口,重写方法。这样责任链的每个类都有一个相同的方法。

1.小于5的数值定义该数值正确或错误
package com.impl;

import com.ykq.NumInf;

/**
 * <= 5的数值处理
 */
public class FiveImpl implements NumInf {
    private NumInf nextNumImpl;

    public NumInf getNextNumImpl() {
        return nextNumImpl;
    }

    public void setNextNumImpl(NumInf nextNumImpl) {
        this.nextNumImpl = nextNumImpl;
    }

    public boolean checkNumCurrent(int num) {
        System.out.println("进入 <= 5 值的数值判断!");
        if(num <= 5){
            // 当数值小于5时,由该类处理判断是否正确
            // 此处校验规则由该类自己决定,不受其他类干涉
            if(num % 2 == 0){
                return true;
            } else {
                return false;
            }
        } else {
            return nextNumImpl.checkNumCurrent(num);
        }
    }
}
2.小于10的数值定义该数值正确或错误
package com.impl;

import com.ykq.NumInf;

/**
 * <= 10的处理
 */
public class TenImpl implements NumInf {
    private NumInf nextNumImpl;

    public NumInf getNextNumImpl() {
        return nextNumImpl;
    }

    public void setNextNumImpl(NumInf nextNumImpl) {
        this.nextNumImpl = nextNumImpl;
    }

    public boolean checkNumCurrent(int num) {
        System.out.println("进入 <= 10 值的数值判断!");
        if(num <= 10){
            // 当数值小于10时,由该类处理判断是否正确
            // 此处校验规则由该类自己决定,不受其他类干涉
            if(num % 2 == 0){
                return false;
            } else {
                return true;
            }
        } else {
            return nextNumImpl.checkNumCurrent(num);
        }
    }
}
3.小于100的数值定义该数值正确或错误
package com.impl;

import com.ykq.NumInf;

/**
 * <= 100的数值处理
 */
public class HundredImpl implements NumInf {
    private NumInf nextNumImpl;

    public NumInf getNextNumImpl() {
        return nextNumImpl;
    }

    public void setNextNumImpl(NumInf nextNumImpl) {
        this.nextNumImpl = nextNumImpl;
    }

    public boolean checkNumCurrent(int num) {
        System.out.println("进入 <= 100 值的数值判断!");
        if(num <= 100){
            // 当数值小于100时,由该类处理判断是否正确
            // 此处校验规则由该类自己决定,不受其他类干涉
            switch(num){
                case 20:
                case 30:
                case 40:
                case 50:
                case 60:
                case 70:
                case 80:
                case 90:
                    return true;
                default:
                    return false;
            }
        } else {
            return nextNumImpl.checkNumCurrent(num);
        }
    }
}
4.小于1000的数值定义该数值正确或错误
package com.impl;

import com.ykq.NumInf;

/**
 * <= 1000的数值处理
 */
public class ThousandImpl implements NumInf {
    private NumInf nextNumImpl;

    public NumInf getNextNumImpl() {
        return nextNumImpl;
    }

    public void setNextNumImpl(NumInf nextNumImpl) {
        this.nextNumImpl = nextNumImpl;
    }

    public boolean checkNumCurrent(int num) {
        System.out.println("进入 <= 1000 值的数值判断!");
        if(num <= 1000){
            // 当数值小于1000时,由该类处理判断是否正确
            // 此处校验规则由该类自己决定,不受其他类干涉
            switch(num){
                case 200:
                case 300:
                case 400:
                case 500:
                case 600:
                case 700:
                case 800:
                case 900:
                    return false;
                default:
                    return true;
            }
        } else {
            return nextNumImpl.checkNumCurrent(num);
        }
    }
}
5.更大的数值定义该数值正确或错误
package com.impl;

import com.ykq.NumInf;

/**
 * 更大的数值处理
 */
public class BiggerImpl implements NumInf {
    private NumInf nextNumImpl;

    public NumInf getNextNumImpl() {
        return nextNumImpl;
    }

    public void setNextNumImpl(NumInf nextNumImpl) {
        this.nextNumImpl = nextNumImpl;
    }

    public boolean checkNumCurrent(int num) {
        System.out.println("进入 > 1000 值的数值判断!");
        return false;
    }
}

那么实际上,对于上述责任链,我还可以继续扩充责任链的节点。小于0的方向可以扩充,大于1000的方向也可以扩充。

3.main实现

main的实现可以设置链条的每一节,这样使得责任链具有灵活性。
下面的实现,则是把上面已有的节点类,都加入了进来。
那么实际上我少一个或两个节点,对于数值的判断正误,很可能的接口就是返回的结果不一样。

package com;

import com.impl.*;
import com.ykq.NumInf;

public class MainClass {
    public static void main(String[] args){
        FiveImpl fiveImpl = new FiveImpl();
        TenImpl tenImpl = new TenImpl();
        HundredImpl hundredImpl = new HundredImpl();
        ThousandImpl thousandImpl = new ThousandImpl();
        BiggerImpl biggerImpl = new BiggerImpl();
        fiveImpl.setNextNumImpl(tenImpl);
        tenImpl.setNextNumImpl(hundredImpl);
        hundredImpl.setNextNumImpl(thousandImpl);
        thousandImpl.setNextNumImpl(biggerImpl);
        // 判断数boolean值
        System.out.println(fiveImpl.checkNumCurrent(999));
    }
}
二、变种责任链模式

我们常见的变种责任链就是过滤器。Filter提供一个接口,我们实现接口,然后通过链条的方式走到下一个过滤器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值