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);
    		}
    		
    	} 
    
    }
    

      

     

     

  • 相关阅读:
    hive与hbase整合
    待重写
    hive DML
    【知识强化】第六章 总线 6.1 总线概述
    【知识强化】第五章 中央处理器 5.1 CPU的功能和基本结构
    【知识强化】第四章 指令系统 4.3 CISC和RISC的基本概念
    【知识强化】第四章 指令系统 4.2 指令寻址方式
    【知识强化】第四章 指令系统 4.1 指令格式
    【知识强化】第三章 存储系统 3.6 高速缓冲存储器
    【知识强化】第三章 存储系统 3.5 双口RAM和多模块存储器
  • 原文地址:https://www.cnblogs.com/dream-to-pku/p/9528220.html
Copyright © 2011-2022 走看看