Java设计模式——责任链模式

Java设计模式之责任链模式

责任链模式:为某个请求创建一个对象链,每个对象义序检查此请求,并对其进行处理,或者将其出给链中下一个对象。

  • Handler:抽象的处理对象接口
  • ConcreteHandler:具体的处理对象,有多个构成对象链,每个处理对象持有下一个处理对象的引用

使用

场景:一个公司的邮件分为三类:

  • 粉丝发的:交给老板处理
  • 抱怨产品的:交给产品部处理
  • 垃圾邮件:交给管理员处理

先交给管理员处理,处理不了传给产品部,处理不了传给老板处理,责任链:管理员—>产品部—>老板

代码:

  • EmailHandler 抽象邮件处理类接口
public abstract class EmailHandler {
    private EmailHandler nextHandler;//链中下一个处理对象
    public void setNextHandler(EmailHandler handler){
        this.nextHandler = handler;
    }
    public EmailHandler getNextHandler(){
        return nextHandler;
    }
    public abstract void handlerEmail(Email email);
}
  • ComplainEmailHandler 抱怨邮件处理类
public class ComplainEmailHandler extends EmailHandler{
    public void handlerEmail(Email email) {
        if(email.equals(Email.COMPLAIN)){
            System.out.println("这封邮件是:"+email.getKind());
            System.out.println("交给产品部处理");
        }else {
            getNextHandler().handlerEmail(email);
        }
    }
}
  • FansEmailHandler 粉丝邮件处理类
public class FansEmailHandler extends EmailHandler{
    public void handlerEmail(Email email) {
        if(email.equals(Email.FANS)){
            System.out.println("这封邮件是:"+email.getKind());
            System.out.println("交给老板处理");
        }
    }
}
  • TrashEmailHandler 垃圾邮件处理类
public class TrashEmailHandler extends EmailHandler{
    public void handlerEmail(Email email) {
        if(email.equals(Email.TRASH)){
            System.out.println("这封邮件是:"+email.getKind());
            System.out.println("交给管理员处理");
        }else {
            getNextHandler().handlerEmail(email);
        }
    }
}
  • Email 邮件枚举类
public enum Email {
    FANS(1,"粉丝邮件"),
    COMPLAIN(2,"抱怨产品邮件"),
    TRASH(3,"垃圾邮件");
    private int i;
    private String kind;
    Email(int i, String kind) {
        this.i = i;
        this.kind = kind;
    }
    public String getKind(){
        return kind;
    }
}
  • Test测试
public class Test {
    //设置处理链
    public static EmailHandler getAndsetEmailHandlerChain(){
        EmailHandler fansHandler  = new FansEmailHandler();
        EmailHandler complainHandler = new ComplainEmailHandler();
        EmailHandler trashHandler = new TrashEmailHandler();
        trashHandler.setNextHandler(complainHandler);
        complainHandler.setNextHandler(fansHandler);
        return trashHandler;
    }
    public static void main(String[] args) {
        EmailHandler firstHandler = Test.getAndsetEmailHandlerChain();
        firstHandler.handlerEmail(Email.COMPLAIN);
        System.out.println("\n");
        firstHandler.handlerEmail(Email.FANS);
        System.out.println("\n");
        firstHandler.handlerEmail(Email.TRASH);
    }
}

输出:
这封邮件是:抱怨产品邮件
交给产品部处理

这封邮件是:粉丝邮件
交给老板处理

这封邮件是:垃圾邮件
交给管理员处理

tomcat的过滤器就是使用责任链模式

public void doFilter(ServletRequest request, ServletResponse response,
         FilterChain chain) throws IOException, ServletException {

     chain.doFilter(request, response);
 }

责任链模式优点:

  • 将请求发送者和接收者解耦
  • 可以动态改变链顺序

代码地址:Github责任链模式


Java设计模式|策略模式

Java设计模式|观察者模式

Java设计模式|装饰者模式

Java设计模式|工厂模式

Java设计模式|命令模式

Java设计模式|适配器模式和外观模式

Java设计模式|模板方法模式

Java设计模式|迭代器模式和组合模式

Java设计模式|状态模式

Java设计模式|代理模式

Java设计模式|单例模式

Java设计模式|备忘录模式

Java设计模式|访问者模式

Java设计模式|复合模式

Java设计模式|桥接模式

Java设计模式|生成器模式

Java设计模式|享元模式/蝇量模式

Java设计模式|原型模式

Java设计模式|责任链模式

Java设计模式|中介者模式

  • 本文作者: dzou | 微信:17856530567
  • 本文链接: http://www.dzou.top/post/de32d4c3.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
  • 并保留本声明和上方二维码。感谢您的阅读和支持!