JAVA-设计模式-责任链模式(代码示例)

为方便展示设计思想   改进前

package com.example.dutyLink.dutyLink;

public class dutyLink1 {

    public static class OneHandler {
        public static Integer handler(Integer number) {
            if (number >= 10) {
                //具体逻辑处理
                System.out.println("OneHandler " + number);
            }
            return number;
        }
    }

    public static class TwoHandler {
        public static Integer handler(Integer number) {
            if (number >= 100) {
                //具体逻辑处理
                System.out.println("TwoHandler " + number);
            }
            return number;
        }
    }

    public static class ThreeHandler {
        public static Integer handler(Integer number) {
            if (number >= 1000) {
                //具体逻辑处理
                System.out.println("ThreeHandler " + number);
            }
            return number;
        }
    }

    public static void main(String[] args) {
        OneHandler oneHandler = new OneHandler();
        TwoHandler twoHandler = new TwoHandler();
        ThreeHandler threeHandler = new ThreeHandler();

        Integer number = 10;
        //数量 大于等于 10 100 1000 进入下次逻辑处理
        number = oneHandler.handler(number);
        if (number >= 100) {
            number = twoHandler.handler(number);
            if (number >= 1000) {
                number = threeHandler.handler(number);
                if(number >=1000){
                    //如判断条件约束越多 此处嵌套越多
                }
            }
        }
    }

}

为方便展示设计思想   改进后(高级应用)

改进后只需增加枚举中额外责任对象即可    业务逻辑顺序调整也比方便  功能清晰

1、统一管理责任链责任对象

package com.example.dutyLink.dutyLink4.service.abs;

public abstract class DutyLinkAbstract {

    protected DutyLinkAbstract next;

    public void setNext(DutyLinkAbstract next) {
        this.next = next;
    }

    //顺序责任链处理
    public abstract void service(Integer  number);
    //条件责任链处理
    public abstract void service(String  str);
}
package com.example.dutyLink.dutyLink4.service;

import com.example.dutyLink.dutyLink4.service.abs.DutyLinkAbstract;

public class ApiDutyLink extends DutyLinkAbstract {

    public ApiDutyLink() {
//        System.out.println(this.getClass());
    }

    @Override
    public void service(Integer  number) {
        System.out.println("API接口拦截");
        if(this.next != null && number >10){
            this.next.service(number);
        }
    }

    @Override
    public void service(String str) {
        if ("AAA".equalsIgnoreCase(str)) {
            System.out.println("API接口拦截 处理请求");
        } else if (this.next != null) {
            this.next.service(str);
        }
    }
}
package com.example.dutyLink.dutyLink4.service;

import com.example.dutyLink.dutyLink4.service.abs.DutyLinkAbstract;

public class BlackDutyLink extends DutyLinkAbstract {
    public BlackDutyLink() {
//        System.out.println(this.getClass());
    }

    @Override
    public void service(Integer number) {
        System.out.println("黑名单白名单拦截");
        if (this.next != null && number > 100) {
            this.next.service(number);
        }
    }

    @Override
    public void service(String str) {
        if ("BBB".equalsIgnoreCase(str)) {
            System.out.println("黑名单白名单拦截 处理请求");
        } else if (this.next != null) {
            this.next.service(str);
        }
    }
}
package com.example.dutyLink.dutyLink4.service;

import com.example.dutyLink.dutyLink4.service.abs.DutyLinkAbstract;

public class UserDutyLink extends DutyLinkAbstract {
    public UserDutyLink() {
//        System.out.println(this.getClass());
    }

    @Override
    public void service(Integer number) {
        System.out.println("用户登录拦截");
        if (this.next != null && number > 1000) {
            this.next.service(number);
        }
    }

    @Override
    public void service(String str) {
        if ("ccc".equalsIgnoreCase(str)) {
            System.out.println("用户登录拦截 处理请求");
        } else if (this.next != null) {
            this.next.service(str);
        }
    }
}

2、统一处理 初始化 责任链

package com.example.dutyLink.dutyLink4;


public enum DutyLinkEnum {
    // 责任链id 责任链名称 责任链全限定路径 上一个责任链 下一个责任链
    ONE_HANDLER(new DutyLinkEntity(1, "API接口拦截", "com.example.dutyLink.dutyLink4.service.ApiDutyLink", null, 2)),
    TWO_HANDLER(new DutyLinkEntity(2, "黑名单白名单拦截", "com.example.dutyLink.dutyLink4.service.BlackDutyLink", 1, 3)),
    THREE_HANDLER(new DutyLinkEntity(3, "用户登录拦截", "com.example.dutyLink.dutyLink4.service.UserDutyLink", 2, null)),
    ;

    DutyLinkEntity dutyLinkEntity;

    public DutyLinkEntity getDutyLinkEntity() {
        return dutyLinkEntity;
    }

    DutyLinkEnum(DutyLinkEntity dutyLinkEntity) {
        this.dutyLinkEntity = dutyLinkEntity;
    }
}






package com.example.dutyLink.dutyLink4;


public class DutyLinkEntity {

    private Integer dutyLinkId;
    private String dutyLinkName;
    private String classPathName;
    private Integer preId;
    private Integer nextId;

    public DutyLinkEntity(Integer dutyLinkId, String dutyLinkName, String classPathName, Integer preId, Integer nextId) {
        this.dutyLinkId = dutyLinkId;
        this.dutyLinkName = dutyLinkName;
        this.classPathName = classPathName;
        this.preId = preId;
        this.nextId = nextId;
    }

    public DutyLinkEntity() {
    }

    public Integer getDutyLinkId() {
        return dutyLinkId;
    }

    public void setDutyLinkId(Integer dutyLinkId) {
        this.dutyLinkId = dutyLinkId;
    }

    public String getDutyLinkName() {
        return dutyLinkName;
    }

    public void setDutyLinkName(String dutyLinkName) {
        this.dutyLinkName = dutyLinkName;
    }

    public String getClassPathName() {
        return classPathName;
    }

    public void setClassPathName(String classPathName) {
        this.classPathName = classPathName;
    }

    public Integer getPreId() {
        return preId;
    }

    public void setPreId(Integer preId) {
        this.preId = preId;
    }

    public Integer getNextId() {
        return nextId;
    }

    public void setNextId(Integer nextId) {
        this.nextId = nextId;
    }
}
package com.example.dutyLink.dutyLink4;

import java.util.HashMap;
import java.util.Map;

public class DutyLinkDao {


    //初始化 将枚举中配置的责任对象放到map中  方便获取
    private static Map<Integer, DutyLinkEntity> dutyLinkMap = new HashMap<>();

    static {
        for (DutyLinkEnum value : DutyLinkEnum.values()) {
            DutyLinkEntity gatewayEntity = value.getDutyLinkEntity();
            dutyLinkMap.put(gatewayEntity.getDutyLinkId(), gatewayEntity);
        }
    }

    public DutyLinkEntity getDutyLinkEntity(Integer dutyLinkId) {
        return dutyLinkMap.get(dutyLinkId);
    }

    public DutyLinkEntity getFirstEntity() {
        for (Map.Entry<Integer, DutyLinkEntity> entry : dutyLinkMap.entrySet()) {
            DutyLinkEntity value = entry.getValue();
            //  当不存在 上一个责任对象id时   及第一个 (可以写死)
            if (value.getPreId() == null) {
                return value;
            }
        }
        return null;
    }
}

package com.example.dutyLink.dutyLink4;

import com.example.dutyLink.dutyLink4.service.abs.DutyLinkAbstract;

public class DutyLinkEnumFactory {

    private static DutyLinkDao dutyLinkDao = new DutyLinkDao();

    // 使用工厂模式 方便取用  并将多个责任对象串行起来(责任链)
    public static DutyLinkAbstract getFirstHandler() {

        DutyLinkEntity firstEntity = dutyLinkDao.getFirstEntity();
        DutyLinkAbstract dutyLinkAbstract = newDutyLinkEntity(firstEntity);
        if (dutyLinkAbstract == null) {
            return null;
        }

        DutyLinkEntity tempEntity = firstEntity;
        Integer nextId = null;
        DutyLinkAbstract tempAbstract = dutyLinkAbstract;
        // 迭代所有DutyLink,以及将它们链接起来
        while ((nextId = tempEntity.getNextId()) != null) {
            DutyLinkEntity dutyLinkEntity = dutyLinkDao.getDutyLinkEntity(nextId);
            DutyLinkAbstract newAbstract = newDutyLinkEntity(dutyLinkEntity);
            tempAbstract.setNext(newAbstract);
            tempAbstract = newAbstract;
            tempEntity = dutyLinkEntity;
        }
    // 返回第一个handler
        return dutyLinkAbstract;
    }



     //反射  生成责任对象
    private static DutyLinkAbstract newDutyLinkEntity(DutyLinkEntity firstEntity) {
        // 获取全限定类名
        String classPathName = firstEntity.getClassPathName();
        try {
            // 根据全限定类名,加载并初始类
            Class<?> clazz = Class.forName(classPathName);
            return (DutyLinkAbstract) clazz.newInstance();
        } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
            e.printStackTrace();
        }
        return null;
    }


}

3、测试类

package com.example.dutyLink.dutyLink4.mian;

import com.example.dutyLink.dutyLink4.DutyLinkEnumFactory;
import com.example.dutyLink.dutyLink4.service.abs.DutyLinkAbstract;

public class dutyLink4 {

    public static void main(String[] args) {
        DutyLinkAbstract dutyLinkAbstract = DutyLinkEnumFactory.getFirstHandler();
        dutyLinkAbstract.service(10);
        System.out.println("--------------------------------");
        dutyLinkAbstract.service(100);
        System.out.println("--------------------------------");
        dutyLinkAbstract.service(1000);


        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
        String str = "CCC";
        dutyLinkAbstract.service(str);
    }
}

4、注意 此处是我的类路径

 人工手写,亲测可用。(注:复杂逻辑请自行 编写)(注:代码中出现词语为个人理解,希望大家能看懂)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值