介绍
责任链模式(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、可能不容易观察运行时的特征,有碍于除错。