责任链模式

责任链模式

介绍

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,用于将请求从一个处理者传递到另一个处理者,直到请求被处理为止。

使用场景

1、红楼梦中的"击鼓传花"。
2、公司审批

案例

前端表单请求转换成后端实体类

类型转换链

public class TypeSwitchChain {
    private Iterator<TypeSwitch> iterator;
    private static List<Class<?>> classList;

    static {
        classList =ScanUtils.scanImpl(TypeSwitch.class, "top.lldwb.servlet.type.impl");
    }

    public TypeSwitchChain() {
        List<TypeSwitch> list = new ArrayList<>();
        classList.forEach(clazz->{
            try {
                list.add((TypeSwitch) clazz.newInstance());
            } catch (InstantiationException e) {
                throw new RuntimeException(e);
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            }
        });
        iterator = list.listIterator();
    }

    public Object doTypeSwitch(Field field, String value) {
        if (iterator.hasNext()) {
            TypeSwitch typeSwitch = iterator.next();
            return typeSwitch.valueOf(this, field, value);
        } else {
            throw new RuntimeException("没有对应的链");
        }
    }
}

类型转换接口

public interface TypeSwitch {
    /**
     * 可以处理返回值
     * 不可以处理返回 null
     *
     * @param field 字段
     * @param value 需要转换的值
     * @return
     */
    Object valueOf(TypeSwitchChain typeSwitchChain, Field field, String value);
}

类型转换实现类

String 类型转换
public class StringSwitch implements TypeSwitch {
    @Override
    public Object valueOf(TypeSwitchChain typeSwitchChain, Field field, String value) {
        if (field.getType() == String.class) {
            return value;
        } else {
            return typeSwitchChain.doTypeSwitch(field,value);
        }
    }
}
Integer 类型转换
public class IntegerSwitch implements TypeSwitch {
    @Override
    public Object valueOf(TypeSwitchChain typeSwitchChain, Field field, String value) {
        if (field.getType() == Integer.class || field.getType() == Integer.TYPE) {
            return Integer.valueOf(value);
        } else {
            return typeSwitchChain.doTypeSwitch(field,value);
        }
    }
}

实体类

@Data
public class User {
    private String userName;
    private Integer age;
}

优缺点

优点

1、降低耦合度。它将请求的发送者和接收者解耦。
2、简化了对象。使得对象不需要知道链的结构。
3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
4、增加新的请求处理类很方便。

缺点

1、不能保证请求一定被接收。
2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
3、可能不容易观察运行时的特征,有碍于除错。