zoukankan      html  css  js  c++  java
  • 设计模式——职责链模式

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

    *在一个纯的职责链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的职责链模式里面,一个请求可以最终不被任何接收端对象所接收。

    适用性
      在以下条件下使用Responsibility 链:
      有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
      你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
      可动态指定一组对象处理请求。

    模式的组成
      抽象处理者角色(Handler:Approver):定义一个处理请求的接口,和一个后继连接(可选)
      具体处理者角色(ConcreteHandler:President):处理它所负责的请求,可以访问后继者,如果可以处理请求则处理,否则将该请求转给他的后继者。
      客户类(Client):向一个链上的具体处理者ConcreteHandler对象提交请求。

    优点

      降低耦合度 :该模式使得一个对象无需知道是其他哪一个对象处理其请求。对象仅需知道该请求会被“正确”地处理。接收者和发送者都没有对方的明确的信息,且链中的对象不需知道链的结构。
      职责链可简化对象的相互连接:结果是,职责链可简化对象的相互连接。它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用。
      增强了给对象指派职责(Responsibility)的灵活性:当在对象中分派职责时,职责链给你更多的灵活性。你可以通过在运行时刻对该链进行动态的增加或修改来增加或改变处理一个请求的那些职责。你可以将这种机制与静态的特例化处理对象的继承机制结合起来使用。
      增加新的请求处理类很方便

    缺点

      不能保证请求一定被接收。既然一个请求没有明确的接收者,那么就不能保证它一定会被处理 —该请求可能一直到链的末端都得不到处理。一个请求也可能因该链没有被正确配置而得不到处理。
      系统性能将受到一定影响,而且在进行代码调试时不太方便;可能会造成循环调用。

    实现

      人类的发展,然后对人类的需求进行分析实现。类图如下:

    AbstractHuman的定义:

    package com.lidaming.design18.chain;
    
    public abstract class AbstractHuman {
        public AbstractHuman human;
        public void setHuman(AbstractHuman huamn){
            this.human=huamn;
        }
        public abstract void process(String need);
    }
    View Code

    FoodManager的定义:

    package com.lidaming.design18.chain;
    
    public class FoodMananger extends AbstractHuman {
     
        @Override
        public void process(String need) {
            if(need=="food")
            {
                System.out.println("food is enough");
            }
            else
            {
                if(human!=null)
                {
                    human.process(need);
                }
                else
                {
                    System.out.println("sorry,i have no food");
                }
            }
        }
    
    }
    View Code

    ToolManager的定义:

    package com.lidaming.design18.chain;
    
    public class ToolMananger extends AbstractHuman {
    
        @Override
        public void process(String need) {
            if(need=="tool")
            {
                System.out.println("give you a tool");
            }
            else
            {
                if(human!=null)
                {
                    human.process(need);
                }
                else
                {
                    System.out.println("sorry,we can not for you");
                }
            }
        }
    
    }
    View Code

    HumanManager的定义:

    package com.lidaming.design18.chain;
    
    public class HumanManager extends AbstractHuman {
    
        @Override
        public void process(String need) {
            if (need.equals("job")) {
                System.out.println("give u an offer");
            } else {
                if (human != null) {
                    human.process(need);
                } else {
                    System.out.println("no offer for u");
                }
            }
        }
    
    }
    View Code

    场景类的实现:

    package com.lidaming.design18.chain;
    
    public class Client {
        public static void main(String[] args) {
    
            FoodMananger food = new FoodMananger();
            ToolMananger tool = new ToolMananger();
            HumanManager human = new HumanManager();
    
            food.setHuman(tool);
            tool.setHuman(human);
    
            food.process("tool");
            food.process("aa");
        }
    }
    View Code

    参考
    http://www.jayfeng.com/2016/04/09/理解设计模式之状态模式、职责链模式/
    http://blog.csdn.net/hguisu/article/details/7547231

  • 相关阅读:
    二十四 多重继承
    二十三 使用@property
    Tornado 协程
    基于协程的Python网络库gevent
    用greenlet实现Python中的并发
    在Nginx上配置多个站点
    python 使用Nginx和uWSGI来运行Python应用
    在Apache中运行Python WSGI应用
    Python打包分发工具setuptools
    Python 远程部署 Fabric
  • 原文地址:https://www.cnblogs.com/hpuCode/p/5441157.html
Copyright © 2011-2022 走看看