责任链模式+builder模式
适合应用场景
1.多个对象可以处理同一个请求,但具体由哪个对象处理则在运行时动态决定。
2.在请求处理者不明确的情况下向对个对象中的一个提交一个请求。
3.需要动态处理一组对象处理请求。
优缺点
责任链模式的优点
1.将请求与处理解耦。
2.请求处理者(节点对象)只需关注自己感兴趣的请求进行处理即可,对于不感兴趣的请求,直接转发给下一个节点对象。
3.具备链式传递处理请求功能,请求发送者不需要知晓链路结构,只需等待请求处理结果即可。
4.链路结构灵活,可以通过改变链路结构动态地新增或删减责任。
5.易于扩展新的请求处理类(节点),符合开闭原则。
责任链模式的缺点
1.责任链太长或者处理时间过长,会影响整体性能。
2.如果节点对象存在循环引用,则会造成死循环,导致系统崩溃。
代码
/**
* 责任链+builder
*
* <p>AbstractSlot.Builder builder = new AbstractSlot.Builder();
* <p>builder.addSlot(new XxxxSlot());
* <p>builder.build().process0();
* @author tengfei33
*
*/
public abstract class AbstractSlot {
protected AbstractSlot next;
private void next(AbstractSlot next) {
this.next = next;
}
public void process0(Member member) {
this.process1(member);
if (null != next) {
next.process0(member);
}
}
protected abstract void process1(Member member);
public static class Builder {
private AbstractSlot head;
private AbstractSlot tail;
public Builder addSlot(AbstractSlot slot) {
if (this.head == null) {
this.head = this.tail = slot;
return this;
}
this.tail.next(slot);
this.tail = slot;
return this;
}
public AbstractSlot build() {
return this.head;
}
}
}
public class Test {
public static void main(String[] args) {
AbstractSlot.Builder builder = new AbstractSlot.Builder();
//这里就是链式编程,谁在前谁在后看的清清楚楚,明明白白
builder.addSlot(new ValidateSlot());
Member member = new Member();
member.setUsername("");
member.setPassword("");
builder.build().process0(member);
}
}
import org.apache.commons.lang3.StringUtils;
public class ValidateSlot extends AbstractSlot {
@Override
public void process1(Member member) {
if (StringUtils.isEmpty(member.getUsername()) ||
StringUtils.isEmpty(member.getPassword())) {
System.out.println("用户名和密码不能为空");
return;
}
if (null != next) {
next.process1(member);
}
}
}
评论
发表评论
|
|