责任链模式+builder模式

  |   0 评论   |   1,172 浏览

适合应用场景

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);
        }
    }
}

评论

发表评论

validate