为方便展示设计思想 改进前
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、注意 此处是我的类路径
人工手写,亲测可用。(注:复杂逻辑请自行 编写)(注:代码中出现词语为个人理解,希望大家能看懂)