java 设计模式之责任链模式

sancaiodm Java 2021-12-05 654 0

责任链模式

类似日常生活中把一个任务分配给一群人,但他们都不太愿意干这事,所以他们就会一个一个推下去直到有一个人来处理这事件,

image.png


责任链模式定义:

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


    责任链模式优点显而易见,降低了请求对象与处理对像之间的耦合度,处理对象易于扩展,增强了指派处理对象的灵活性。

    责任链简化了对象之间的连接。每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句。


使用场景:

  一般如果由多个对象处理一个请求,需要使用哪对象由实际调用的时候确定。这种场景我们就可以使用调用者模式


代码示例:

/**
 * 
 * @author androidos.net
 * 抽象处理者基类
 *
 */
public abstract class Handler {
	
	Handler nextHandler;
	
	void setNexdHandler(Handler hanlder) {
		nextHandler= hanlder;
	}
	
	public Handler getNextHandler() {
		return nextHandler;
	}
	
	public abstract void handRequest(String message);

}

/**
 * 
 * @author androidos.net
 * 处理者2
 */
public class ConcrectHandler2 extends Handler {

	@Override
	public void handRequest(String message) {
		// TODO Auto-generated method stub
		if(message.equalsIgnoreCase("2")) {
			System.out.println("ConcrectHandler2:: "+message);
			return;
		}
		
		if(null != getNextHandler()) {
			getNextHandler().handRequest(message);
			return;
		}
		
		System.out.println("这是最后一个处理者了,");
	}
}

/**
 * 
 * @author androidos.net
 * 处理者3
 */
public class ConcrectHandler3 extends Handler {

	@Override
	public void handRequest(String message) {
		// TODO Auto-generated method stub
		if(message.equalsIgnoreCase("3")) {
			System.out.println("ConcrectHandler3:: "+message);
			return;
		}
		
		if(null != getNextHandler()) {
			getNextHandler().handRequest(message);
			return;
		}
		
		System.out.println("这是最后一个处理者了,处理者3,");
		
	}
}

请求发送者

public class Invoker {

	public static void main(String[] args) {
		ConcrectHandler1  handler1 = new ConcrectHandler1();
		
		ConcrectHandler2  handler2 = new ConcrectHandler2();
		ConcrectHandler3  handler3 = new ConcrectHandler3();
		handler1.setNexdHandler(handler2);
		handler2.setNexdHandler(handler3);
		
		handler1.handRequest("6");
	}
}

执行输出:
image.png

评论