设计模式之责任链模式

Posted 独孤九戒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之责任链模式相关的知识,希望对你有一定的参考价值。

设计模式之责任链模式

    责任链模式的定义:Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.(使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理该请求为止)

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

通用类图

通用代码

抽象处理者

public abstract class Handler 
	private Handler nextHandler;
	public final Response handlMessage(Request request)
		Response response=null;
		if(this.getHandlerLevel().equals(request.getRequestLevel()))
			response=this.echo(request);
		else
			if(this.nextHandler!=null)
				response=this.nextHandler.handleMessage(request);
			else
				
			
		
		return response;
	
	
	public void setNext(Handler _handler)
		this.nextHandler=_handler;
	
	protected abstract Level getHandlerLevel();
	protected abstract Response echo(Request request);

具体处理者

public class ConcreteHandler1 extends Handler
	protected Response echo(Request request)
		return null;
	
	protected Level getHandlerLevel()
		return null;
	

public class ConcreteHandler2 extends Handler
	protected Response echo(Request request)
		return null;
	
	protected Level getHandlerLevel()
		return null;
	

public class ConcreteHandler3 extends Handler
	protected Response echo(Request request)
		return null;
	
	protected Level getHandlerLevel()
		return null;
	

有关代码框架

public class Level 

public class Request 
	public Level getRequestLevel()
		return null;
	
	public class Response;
public class Response 

场景类

public class Client 

	public static void main(String[] args) 
		// TODO Auto-generated method stub
		Handler handle1=new ConcreteHandler1();
		Handler handle2=new ConcreteHandler2();
		Handler handle3=new ConcreteHandler3();
		handle1.setNext(handle2);
		handle2.setNext(handle3);
		Response response=handle1.handlMessage(new Request());
	

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

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

注意事项

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

例子:古代妇女三从四德

女性接口

public interface IWoman 
	public int getType();
	public String getRequest();
古代妇女
public class Women implements IWoman
	private int type=0;
	
	private String request="";
	
	public Women(int _type,String _request)
		this.type=_type;
		switch(this.type)
		case 1:
			this.request="女儿的请求是:"+_request;
			break;
		case 2:
			this.request="妻子的请求是:"+_request;
			break;
		case 3:
			this.request="母亲的请求是:"+_request;
			break;
		
	
	public int getType()
		return this.type;
	
	public String getRequest()
		return this.request;
	

Handler类

public abstract class Handler 
	public final static int FATHER_LEVEL_REQUEST=1;
	public final static int HUSBAND_LEVEL_REQUEST=1;
	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(IWoman woman)
		if(woman.getType()==this.level)
			this.response(woman);
		else
			if(this.nextHandler!=null)
				this.nextHandler.HandleMessage(woman);
			else
				System.out.println("没地方请示了");
			
		
	
	
	public void setNext(Handler _handler)
		this.nextHandler=_handler;
	
	protected abstract void response(IWoman woman);

父亲类

public class Father extends Handler
	public Father()
		super(Handler.FATHER_LEVEL_REQUEST);
	
	protected void response(IWoman woman)
		System.out.println("向父亲请示");
		System.out.println(woman.getRequest());
		System.out.println("父亲同意");
	

丈夫类

public class Husband extends Handler
	public Husband()
		super(Handler.HUSBAND_LEVEL_REQUEST);
	
	protected void response(IWoman woman)
		System.out.println("向丈夫请示");
		System.out.println(woman.getRequest());
		System.out.println("丈夫同意");
	

儿子类

public class Son extends Handler
	public Son()
		super(Handler.SON_LEVEL_REQUEST);
	
	protected void response(IWoman woman)
		System.out.println("向儿子请示");
		System.out.println(woman.getRequest());
		System.out.println("儿子同意");
	

场景类

public class Client 

	public static void main(String[] args) 
		// TODO Auto-generated method stub
		Random rand=new Random();
		ArrayList<IWoman> arrayList=new ArrayList();
		for(int i=0;i<5;++i)
			arrayList.add(new Women(rand.nextInt(4),"我要逛街"));
		
		
		Handler father=new Father();
		Handler husband=new Husband();
		Handler son=new Son();
		
		father.setNext(husband);
		husband.setNext(son);
		for(IWoman women:arrayList)
			father.HandleMessage(women);
			
	






以上是关于设计模式之责任链模式的主要内容,如果未能解决你的问题,请参考以下文章

行为型设计模式之责任链模式

设计模式之责任链模式

设计模式之策略模式与责任链模式详解和应用

设计模式之责任链模式

设计模式之责任链模式

5 行为型模式之- 责任链模式