zoukankan      html  css  js  c++  java
  • 14_责任链模式

    【责任链模式】

    也称为职责链模式。

    使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。

    责任链模式的重点是在“链”上,由一条链去处理相似的请求在链中决定谁来处理这个请求,并返回相应的结果。

    【责任链模式 例子】

    package com.Higgin.Handler;
    /**
     * 足球运动员抽象类
     */
    abstract class Player{
        protected Player nextPlayer;
        //得到下一个足球运动员
        public Player getNextPlayer() {
            return nextPlayer;
        }
        //设置要传递的下一个足球运动员
        public void setNextPlayer(Player nextPlayer) {
            this.nextPlayer = nextPlayer;
        }
        //示意处理的方法
        public abstract void playerRequest();
    }
    
    /**
     * 守门员
     */
    class Goalkeeper extends Player{
        @Override
        public void playerRequest() {
            if(nextPlayer!=null){
                System.out.println("守门员:得到球后,传球...");
                nextPlayer.playerRequest();
            }else{
                System.out.println("守门员:120码超级远射!!!");
            }
        }
    }
    /**
     * 后卫
     */
    class Defender extends Player{
        @Override
        public void playerRequest() {
            if(nextPlayer!=null){
                System.out.println("后卫:得到球后,传球...");
                nextPlayer.playerRequest();
            }else{
                System.out.println("后卫:没看到前锋,后卫远射破门!!!");
            }
        }
    }
    /**
     * 前锋
     */
    class Striker extends Player{
        @Override
        public void playerRequest() {
            if(nextPlayer!=null){
                System.out.println("前锋:得到球后,传球...");
                nextPlayer.playerRequest();
            }else{
                System.out.println("前锋,临门一脚破门!!");
            }
        }
    }
    
    
    /**
     * 测试责任链模式
     */
    public class TestHandler {
        public static void main(String[] args) {
            Player goalkeeper=new Goalkeeper();  //守门员
            Player defender=new Defender();      //后卫
            Player striker=new Striker();        //前锋
            
            goalkeeper.setNextPlayer(defender);  //守门员的下一个目标是后卫
            defender.setNextPlayer(striker);     //后卫的下一个目标是前锋
             
            goalkeeper.playerRequest();    //守门员得球后的行为
        }
    }

    【运行结果】

    【责任链模式 优点】

    责任链模式非常显著的优点是将请求和处理分开。请求者不需要知道是谁处理的,处理者可以不用知道请求的全貌,两者解耦,提高系统的灵活性。

    【责任链模式 缺点】

    * 性能问题

    每个请求都是从链头遍历到链尾,特别是链较长的时候,性能是一个大问题。

    * 调试不方便

    同样是链条较长时,环节比较多时,由于采用了类似递归的方式,调试时的逻辑较为复杂。

    【注意事项】

    链中节点数量需要控制,避免出现超长链条的情况,一般的做法是在Handler中设置一个最大节点数量,在setNext方法中判断是否超过其阈值,超过则不允许该链建立,避免无意识地破坏系统性能。

  • 相关阅读:
    ip报文
    常见端口
    navicat15 破解版
    谷歌跨域设置
    CSS flex弹性布局来做 页面底部自适应:页面高度不足时,在底部显示;页面高度超出时,随页面滚动(亲测有效)
    phpstorm 2019 激活码
    aes cbc模式
    Vue的安装及使用快速入门
    从SVN服务器端彻底删除错误提交版本
    Nginx配置https和wss
  • 原文地址:https://www.cnblogs.com/HigginCui/p/6227478.html
Copyright © 2011-2022 走看看