Chain of Responsibility模式

本文介绍了职责链设计模式的基本概念及其实现原理。通过具体的Java代码示例,展示了如何利用职责链模式降低请求发送者与接收者之间的耦合度,实现请求的灵活处理。文章还解释了模式中的主要角色及其作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于cor模式,设计模式之Chain of Responsibility 文章已经讲述了cor的好处,以及如何使用。

说白了,就是推卸责任,一直推到一个能担当此责任的。此模式是个行为模式

《java与模式》书中讲述:

模 式意图:将多个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。客户端并不知道链上的哪个对象最终处理这个请求,从而降低了请求的发 送者和接 收者之间的耦合关系。

职责链设计模式 大概有三个角色:
(1)请求( Request ):封装请 求信息
(2) 处理器( Handler ): 处理请求(Request),一个具体处理器一般只处理一种请 求,如果它不能处理传递过来的请求,那么它就把该请求传递给职责链中的下一个处理器(后继处理器 successor)。
(3)客户端( Client ): 发送请求

对 于handler的作用, 是模式的核心理念所在,解耦就得引入第三方,通过handler连接client与 request,达到解耦功能。

这是模式常用伎俩。

package cor1;

/**
 * 
 * @Filename: Handler.java
 * @Description:Handler 作用:请求的发送者和接受者之间解耦
 */
public abstract class Handler {
	
	//下一个处理者
	protected Handler successor;
	
	/**
	 * 具体处理请求
	 * @param request
	 */
	public  abstract void handleRequest(Request request);
	

	public Handler getSuccessor() {
		return successor;
	}

	public void setSuccessor(Handler successor) {
		this.successor = successor;
	}
	
	
}
package cor1;

public interface Request {
	/**
	 * 请求具体行为
	 */
	public void execute();
}
package cor1;

public class PrintHandler extends Handler {

	@Override
	public void handleRequest(Request request) {
		if (request instanceof PrintRequest) {
			request.execute();
		} else {
			System.out.println("PrintHandler can't handle " + request.getClass().getSimpleName());
			if (successor != null) {
				successor.handleRequest(request);
			}
		}
	}

}
package cor1;

public class SaveHandler extends Handler {

	@Override
	public void handleRequest(Request request) {
		if (request instanceof SaveRequest) {
			request.execute();
		} else {
			System.out.println("SaveHandler can't handle " + request.getClass().getSimpleName());

			if (successor != null) {
				successor.handleRequest(request);
			}
		}
	}

}
package cor1;

public class PrintRequest implements Request{

	@Override
	public void execute() {
		System.out.println("print request");
	}
}
package cor1;

public class SaveRequest implements Request{

	/* (non-Javadoc)
	 * @see cor1.Request#execute()
	 */
	@Override
	public void execute() {
		System.out.println("save request");
	}

}
package cor1;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Handler ph = new PrintHandler();
		Handler sh = new SaveHandler();
		ph.setSuccessor(sh);
		sh.setSuccessor(ph);
		
		Request pr = new PrintRequest();
		Request sr = new SaveRequest();
		
		ph.handleRequest(pr);
		ph.handleRequest(sr);
		
		sh.handleRequest(pr);
		sh.handleRequest(sr);
	}

}

 

转自:http://www.java1995.cn/blog/item/119

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值