职责链模式
职责链模式为请求创建一个接收此次请求对象的链。
为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止,适用于一个请求的处理需要多个对象当中的一个或几个协作处理;
优点:
请求的发送者和接受者(请求的处理)解耦;
职责链可以动态的组合。
缺点:
职责链太长或者处理时间过长,影响性能;
职责链可能过多。
应用场景
有多个对象可以处理一个请求,哪个对象处理该请求由运行时刻自动确定。
可动态指定一组对象处理请求,或添加新的处理者。
在不明确指定请求处理者的情况下,向多个处理者中的一个提交请求。
职责链模式主要包含以下角色。
抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。
1.定义一个抽象字符串验证类,里面包含了一个自身类型的成员变量,这也是该模式的设计核心,以此形成链条
public abstract class StringValidator {
protected StringValidator stringValidator;
public void setStringValidator(StringValidator stringValidator) {
this.stringValidator = stringValidator;
}
public abstract void check(String value);
}
2.验证字符串长度的类
public class LengthValidator extends StringValidator{
@Override
public void check(String value) {
if (value != null && value.length() != 0) {
System.out.println("字符串长度合法");
if (stringValidator != null) {
//利用抽象类中的自身的属性,形成验证链条
stringValidator.check(value);
}
} else {
System.out.println("字符串长度不合法");
}
}
}
3.验证内容的类
public class ValueValidator extends StringValidator {
@Override
public void check(String value) {
if (value.contains("@")) {
System.out.println("字符串值不合法");
if (stringValidator != null) {
stringValidator.check(value);
}
} else {
System.out.println("字符串值合法");
}
}
}
4.测试输出
public class Test {
public static void main(String[] args) {
StringValidator lenthValidator=new LengthValidator();
StringValidator valueValidator=new ValueValidator();
lenthValidator.setStringValidator(valueValidator);
lenthValidator.check("测试@");
}
}
//字符串长度合法
//字符串值不合法