zoukankan      html  css  js  c++  java
  • Java设计模式从精通到入门一 责任链模式

    ​ 一直都想对设计模式有一个深刻的认识,这样对于阅读源码的时候就不会那么吃力了。于是有了想要记录下设计模式的笔记。打算从自己不怎么熟悉的设计模式开始写,里面穿插着一点自己的想法,希望自己写完后,会又一个更深刻的理解和流畅的表述。

    介绍

    ​ 为请求创建了一个接受者的链,通常一个接收者包含下一个接受者的引用,如果该对象不能处理该请求,就传给下一个。依次类推,直到有处理的对象为止。

    应用实例:jsp servlet的Filter,js中的事件冒泡

    例子

    ​ 通过一个例子来深刻的认识他。以前古代女子都遵从着三从四德,三从:一从父亲,二从丈夫,三从儿子。

    也就是在家听父亲的,嫁人后,听丈夫的,丧夫后,听儿子的。

    ​ 那么现在呢,人人平等,那么我就说以后吧,一步小心就是男子三从四德了,那么针对男子进行三从四德进行代码演练。一男子想买键盘,先从母亲开始问起,如果母亲不想理你 ,你就问你妻子,你妻子不理你,你就问你女儿,你女儿也不理,你就啥也不能买。

    代码

    • 抽象未来男子人类
    
    /**
     * @ClassName Human
     * @Description 人类
     * @Author ouyangkang
     * @Date 2018-11-05 10:02
     **/
    public abstract class Human {
        /**
         * @Author ouyangkang
         * @Description 发起请求
         * @Date 10:04 2018/11/5
         * @param
         * @return void
        **/
        public abstract void request();
    
        /**
         * @Author ouyangkang
         * @Description 获取请求的类型
         * @Date 10:05 2018/11/5
         * @param
         * @return java.lang.Integer
        **/
        public abstract Integer getType();
    }
    
    • 具体实现
    
    /**
     * @ClassName Man
     * @Description 未来男子
     * @Author ouyangkang
     * @Date 2018-11-05 10:07
     **/
    public class Man extends Human {
    
        /**
         * @Date 2018/11/5 10:09
         * @Description 请求
         **/
        private String request;
    
    
        /**
         * @Date 2018/11/5 10:14
         * @Description 1 为入赘 2 已入赘 3 丧妻
         **/
        private Integer type ;
    
        @Override
        public void request() {
            System.out.println(request);
        }
    
        @Override
        public Integer getType() {
            return this.type;
        }
    
    
        public Man(String request, Integer type){
            this.request = request;
            this.type = type;
        }
    }
    
    • 处理抽象链
    
    /**
     * @ClassName Handler
     * @Description  责任链
     * @Author ouyangkang
     * @Date 2018-11-05 10:15
     **/
    public abstract class Handler {
    
    
        public static final Integer MOTHER_LEVEL = 1;
    
        public static final Integer WIFE_LEVEL = 2;
    
        public  static final Integer DAUGHTER_LEVEL = 3;
    
        public  Integer level;
    
        /**
         * @Date 2018/11/5 10:16
         * @Description 下一个处理者
         **/
        private Handler nexHandler;
    
        public Handler(Integer level){
            this.level = level;
        }
    
    
        /**
         * @Author ouyangkang
         * @Description 处理信息
         * @Date 10:27 2018/11/5
         * @param human
         * @return void
        **/
        public void handleMessage(Human human){
            if (this.level.equals(human.getType())){
                this.response(human);
            }else {
                if (nexHandler != null){
                    //传递给下一个处理对象
                    this.nexHandler.handleMessage(human);
                }else {
                    System.out.println("---------------");
                    human.request();
                    System.out.println("没有处理的人了");
                }
    
            }
        }
    
        /**
         * @Author ouyangkang
         * @Description 回复未来男子的请求
         * @Date 10:18 2018/11/5
         * @param
         * @return void
        **/
        public abstract void response(Human human);
    
    
        public void setNexHandler(Handler nexHandler){
            this.nexHandler = nexHandler;
        }
    }
    
    • 具体实现
    /**
     * @ClassName Mather
     * @Description 母亲
     * @Author ouyangkang
     * @Date 2018-11-05 10:28
     **/
    public class Mather extends Handler {
    
    
        public Mather(){
            super(Handler.MOTHER_LEVEL);
        }
    
        @Override
        public void response(Human human) {
            System.out.println("-----------------");
            human.request();
            System.out.println("妈妈爱你 当然同意啦");
        }
    }
    
    
    
    /**
     * @ClassName Wife
     * @Description TODO
     * @Author ouyangkang
     * @Date 2018-11-05 10:46
     **/
    public class Wife extends Handler {
    
        public Wife() {
            super(Handler.WIFE_LEVEL);
        }
    
        @Override
        public void response(Human human) {
            System.out.println("-----------------");
            human.request();
            System.out.println("");
        }
    }
    
    /**
     * @ClassName Wife
     * @Description TODO
     * @Author ouyangkang
     * @Date 2018-11-05 10:46
     **/
    public class Wife extends Handler {
    
        public Wife() {
            super(Handler.WIFE_LEVEL);
        }
    
        @Override
        public void response(Human human) {
            System.out.println("-----------------");
            human.request();
            System.out.println("上次你那个机械键盘不是还能用吗 不给买");
        }
    }
    
    /**
     * @ClassName Daughter
     * @Description TODO
     * @Author ouyangkang
     * @Date 2018-11-05 10:48
     **/
    public class Daughter extends Handler {
    
        public Daughter() {
            super(Handler.DAUGHTER_LEVEL);
        }
    
        @Override
        public void response(Human human) {
            System.out.println("-----------------");
            human.request();
            System.out.println("给糖吃就同意");
        }
    }
    
    
    • 客户端
    /**
     * @ClassName Main
     * @Description TODO
     * @Author ouyangkang
     * @Date 2018-11-05 10:49
     **/
    public class Main {
        public static void main(String[] args) {
            Random random = new Random();
            for (int i = 0 ;i < 5;i++){
                Human human = new Man("我要买键盘", random.nextInt(4));
                Handler mather = new Mather();
                Handler wife = new Wife();
                Handler daughter = new Daughter();
                mather.setNexHandler(wife);
                wife.setNexHandler(daughter);
                mather.handleMessage(human);
    
            }
    
        }
    }
    
    • 返回结果
    -----------------
    我要买键盘
    给糖吃就同意
    -----------------
    我要买键盘
    上次你那个机械键盘不是还能用吗 不给买
    -----------------
    我要买键盘
    上次你那个机械键盘不是还能用吗 不给买
    -----------------
    我要买键盘
    妈妈爱你 当然同意啦
    ---------------
    我要买键盘
    没有处理的人了
    
    
  • 相关阅读:
    Java 调用存储过程、函数
    Java BaseDao
    写好Java代码的30条经验总结
    15款Java程序员必备的开发工具
    Oracle基础 表分区
    Oracle基础 索引
    Oracle基础 触发器
    Oracle基础 程序包
    Oracle基础 自定义函数
    Oracle基础 存储过程和事务
  • 原文地址:https://www.cnblogs.com/Krloypower/p/9908992.html
Copyright © 2011-2022 走看看