美文网首页
设计模式-责任链

设计模式-责任链

作者: ManchesterLee | 来源:发表于2018-11-25 19:09 被阅读0次

    责任链设计模式是一种行为模式,其中一组对象按顺序连接在一起,请求在对象链上传递,直到有一个对象处理该请求,返回一个响应对象。否则该请求将继续往下传递。

    <!--more-->

    ## 什么是责任链模式

    为了更好的理解该责任链模式,举一个现实生活中的例子。假设你手中有一个难题,首先你会尝试自己去解决,如果自己无法解决,你会告诉你的一个朋友请求他解决,如果他也无法解决,则他会将该问题传递给下一个朋友去解决,直到有一个人解决了该难题,或者没有人解决。

    责任链模式的意图是避免将请求的发送者和接收者耦合在一起,让每一个接收者都有机会处理该请求。将接收者按顺序连接在一起,并将请求在这条链上往下传递,直到有一个对象处理了该请求。

    ![Chain Of Responsibility](http://piqx1bsi4.bkt.clouddn.com/image/chain_of_responsibility.png)

    ##### Handler

    处理请求的接口

    ##### ConcreteHandler

    处理请求的对象

    ##### Client

    初始化请求并将请求传递到Handler对象链

    ## 实现

    `Handler`表示处理请求对象

    ``` java

    public interface Handler {

        void process(File file);

        String name();

    }

    ```

    `TextFileHandler`可以处理文本类文件

    ```java

    public class TextFileHandler implements Handler {

        private Handler handler;

        public TextFileHandler(Handler handler) {

            this.handler = handler;

        }

        @Override

        public void process(File file) {

            if ("text".equals(file.getType())) {

                System.out.println(file.getName() + " was handled by " + name());

            } else if (handler != null) {

                handler.process(file);

            } else {

                System.out.println(file.getName() + " is not supported");

            }

        }

        @Override

        public String name() {

            return "textFileHandler";

        }

    }

    ```

    `ImageFileHandler`可以处理图像类文件

    ```java

    public class ImageFileHandler implements Handler {

        private Handler handler;

        public ImageFileHandler(Handler handler) {

            this.handler = handler;

        }

        @Override

        public void process(File file) {

            if ("image".equals(file.getType())) {

                System.out.println(file.getName() + " was handled by " + name());

            } else if (handler != null) {

                handler.process(file);

            } else {

                System.out.println(file.getName() + " is not supported");

            }

        }

        @Override

        public String name() {

            return "imageFileHandler";

        }

    }

    ```

    `File`表示被处理的请求

    ```java

    public interface File {

        String getName();

        String getType();

    }

    // 图像文件

    public class ImageFile implements File {

        @Override

        public String getName() {

            return "imageFile";

        }

        @Override

        public String getType() {

            return "image";

        }

    }

    // 文本文件

    public class TextFile implements File {

        @Override

        public String getName() {

            return "textFile";

        }

        @Override

        public String getType() {

            return "text";

        }

    }

    ```

    ```java

    public class Client {

        public static void main(String[] args) {

            ImageFileHandler imageFileHandler = new ImageFileHandler(null);

            TextFileHandler textFileHandler = new TextFileHandler(imageFileHandler);

            TextFile textFile = new TextFile();

            ImageFile imageFile = new ImageFile();

            textFileHandler.process(textFile);

            textFileHandler.process(imageFile);

        }

    }

    ```

    测试程序输出内容

    > textFile was handled by textFileHandler

    >

    > textFileHandler could not handle imageFile

    >

    > imageFile was handled by imageFileHandler

    在上述代码中,文件先交由`TextFileHandler`处理,若其无法处理则传递到下一个`ImageFileHandler`处理。

    对于`TextFile`,`TextFileHandler`直接处理该文件,所以不会再往下传递。

    而对于`ImageFile`,`TextFileHandler`无法处理,则传递到`ImageFileHandler`处理。

    相关文章

      网友评论

          本文标题:设计模式-责任链

          本文链接:https://www.haomeiwen.com/subject/axqmqqtx.html