zoukankan      html  css  js  c++  java
  • 【设计模式】责任链模式

    一、责任链模式的优点

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

    二、责任链模式的缺点

    责任链有两个非常显著的缺点:一是性能问题,每个请求都是从链头遍历到链尾,特别是在链比较长的时候,性能是一个非常大的问题,。二是调试很不方便,特别是链条比较长,环节比较多的时候,由于采用了类似递归的方式,调试的时候逻辑可能比较复杂。

    三、责任链模式的注意事项

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

    四、最佳实践

    在通用源码中Handler是抽象类,融合了模板方法模式,每个实现类只要实现两个方法,echo方法处理请求和getHandlerLevel获得处理级别,想想单一职责和迪米特法则,通过融合模板方式,各个实现类只要关注自己业务逻辑就成了,至于说什么事要自己处理,就让父类去决定,也就是说父类实现了请求传递的功能,子类实现请求的处理,符合单一职责原则,各个实现类只完成一个动作或逻辑,也就是只有一个原因引起类的改变。

    责任链屏蔽了请求的处理过程,你发起一个请求到底是谁处理的,这个你不需要关系,只要你把请求抛给责任链的第一个处理者,最终都会返回一个结果,作为请求者可以不用知道到底是谁来处理的,这是责任链的核心。

    五、代码示例

    未使用责任链模式之前

    package com.slp.responsibility;
    
    public interface IHandler {
    
    	public void HandlerMessage(IWomen women);
    }
    
    package com.slp.responsibility;
    
    public interface IWomen {
       /**
        * 获得个人情况
        * @return
        */
    	public int getType();
    	
    	/**
    	 * 获得个人请示,要做什么?出去逛街?约会?还是看电影?
    	 * @return
    	 */
    	public String getRequest();
    }
    

      

    package com.slp.responsibility;
    
    public class Father implements IHandler {
    
    	/**
    	 * 未出嫁的女儿请示父亲
    	 */
    	@Override
    	public void HandlerMessage(IWomen women) {
    		System.out.println("女儿的请求是:"+women.getRequest());
    		System.out.println("父亲的答复是:同意");
    
    	}
    
    }
    

      

    package com.slp.responsibility;
    
    public class Husband implements IHandler {
    
    	@Override
    	public void HandlerMessage(IWomen women) {
    		System.out.println("妻子的请求是:"+women.getRequest());
    		System.out.println("丈夫的答复是:同意");
    
    	}
    
    }
    

      

    package com.slp.responsibility;
    
    public class Son implements IHandler {
    
    	@Override
    	public void HandlerMessage(IWomen women) {
    		System.out.println("母亲的请求是:"+women.getRequest());
    		System.out.println("儿子的答复是:同意");
    
    	}
    
    }
    

      

    package com.slp.responsibility;
    
    public class Women implements IWomen {
    
    	/**
    	 * 通过int类型的参数来描述个人状况
    	 */
    	private int type = 0;
    	/**
    	 * 获取函数传过来的请求
    	 */
    	private String request = "";
    	@Override
    	public int getType() {
    		return this.type;
    	}
    
    	@Override
    	public String getRequest() {
    		return this.request;
    	}
    
    	public Women(int type, String request) {
    		super();
    		this.type = type;
    		this.request = request;
    	}
    
    }
    

      

    package com.slp.responsibility;
    
    import java.util.ArrayList;
    import java.util.Random;
    
    public class Client {
    
    	public static void main(String[] args) {
    
    		Random random = new Random();
    		ArrayList<IWomen> arrayList = new ArrayList();
    		for(int i=0;i<5;i++){
    			arrayList.add(new Women(random.nextInt(4),"我要出去逛街"));
    		}
    		IHandler father = new Father();
    		IHandler husband = new Husband();
    		IHandler son = new Son();
    		for (IWomen women : arrayList) {
    			if(women.getType()==1){
    				System.out.println("女儿向父亲请示");
    				father.HandlerMessage(women);
    			}else if(women.getType()==2){
    				System.out.println("妻子向丈夫请示");
    				husband.HandlerMessage(women);
    			}else if(women.getType()==3){
    				System.out.println("母亲向儿子请示");
    				son.HandlerMessage(women);
    			}else{
    				System.out.println("不做处理");
    			}
    		}
    	}
    
    }  

     

    使用责任链模式之后

    package com.slp.responsibility.renew;
    
    public interface IWomen {
       /**
        * 获得个人情况
        * @return
        */
    	public int getType();
    	
    	/**
    	 * 获得个人请示,要做什么?出去逛街?约会?还是看电影?
    	 * @return
    	 */
    	public String getRequest();
    }
    

      

    package com.slp.responsibility.renew;
    
    public abstract class Handler {
    
    	public final static int FATHER_LEVEL_REQUEST = 1;
    	public final static int HUSBAND_LEVEL_REQUEST = 2;
    	public final static int SON_LEVEL_REQUEST = 1;
    	//能处理的级别
    	private int level = 0;
    	//责任传递,下一个责任人是谁
    	private Handler nextHandler;
    	//每个类都有说明一下自己能处理哪些请求
    	public Handler(int level) {
    		this.level = level;
    	}
    	//一个女性要求逛街,要按这个请求处理
    	public final void HandleMessage(IWomen women){
    		if(women.getType() == this.level){
    			this.response(women);
    		}else{
    			//有后续环节,才把请求往后递送
    			if(this.nextHandler!=null){
    				this.nextHandler.response(women);
    			}else{
    				System.out.println("---已经没有后续处理人了,按不同意处理---");
    			}
    		}
    	}
    	
    	
    	protected abstract void response(IWomen women);
    	
    	public void setNext(Handler handler){
    		this.nextHandler = handler;
    	}
    }
    

      

    package com.slp.responsibility.renew;
    
    
    public class Father extends Handler{
    
    	public Father() {
    		super(Handler.FATHER_LEVEL_REQUEST);
    		
    	}
    
    	@Override
    	protected void response(IWomen women) {
    		System.out.println("-----女儿向父亲请示----");
    		System.out.println(women.getRequest());
    		System.out.println("父亲的答复是:同意
    ");
    		
    	}
    
    }
    

      

    package com.slp.responsibility.renew;
    
    public class Husband extends Handler {
    
    	public Husband() {
    		super(Handler.HUSBAND_LEVEL_REQUEST);
    		
    	}
    
    	@Override
    	protected void response(IWomen women) {
    		System.out.println("----妻子向丈夫请示----");
    		System.out.println(women.getRequest());
    		System.out.println("丈夫的答复是:同意
    ");
    
    	}
    
    }
    

      

    package com.slp.responsibility.renew;
    
    public class Son extends Handler {
    
    	public Son() {
    		super(Handler.SON_LEVEL_REQUEST);
    	}
    
    	@Override
    	protected void response(IWomen women) {
    		System.out.println("------母亲向儿子请示------");
            System.out.println(women.getRequest());
            System.out.println("儿子的答复是:同意
    ");
    	}
    
    }
    

     

    package com.slp.responsibility.renew;
    
    public class Women implements IWomen {
    
    	private int type = 0;
    	private String request ="";
    	
    	public Women(int type, String request) {
    		super();
    		this.type = type;
    		switch (this.type){
    		case 1:
    			this.request="女儿的请求是:"+request;
    			break;
    		case 2:
    			this.request="妻子的请求是:"+request;
    			break;
    		case 3:
    			this.request="母亲的请求是:"+request;
    			break;			
    		}
    	}
    
    	@Override
    	public int getType() {
    		return this.type;
    	}
    
    	@Override
    	public String getRequest() {
    		// TODO Auto-generated method stub
    		return this.request;
    	}
    
    }
    

      

    package com.slp.responsibility.renew;
    
    import java.util.ArrayList;
    import java.util.Random;
    
    public class Client {
    
    	public static void main(String[] args) {
    
    		Random random = new Random();
    		ArrayList<IWomen> arrayList = new ArrayList();
    		for(int i=0;i<5;i++){
    			arrayList.add(new Women(random.nextInt(4),"我要出去逛街"));
    		}
    		Handler father = new Father();
    		Handler husband = new Husband();
    		Handler son = new Son();
    		father.setNext(husband);
    		husband.setNext(son);
    		for(IWomen women :arrayList){
    			father.HandleMessage(women);
    		}
    		
    	} 
    
    }
    

      

     

     

  • 相关阅读:
    游戏编程模式之事件队列模式
    游戏编程模式之组件模式
    游戏编程模式之类型对象模式
    游戏编程模式之父类沙盒模式
    游戏编程模式之字节码模式
    游戏人工智能简介
    游戏编程模式之更新模式
    游戏编程模式之游戏循环
    .vimrc配置文件 + gvim 运行 gnome-terminal 完成后等待
    js 批量移除steam游戏 移除用户凭证中免费获取的物品
  • 原文地址:https://www.cnblogs.com/dream-to-pku/p/9528220.html
Copyright © 2011-2022 走看看