该文章是本人在慕课网学习责任链模式的一些笔记
责任链模式定义
将介绍者对象连成一条链,并在该链上传递请求,直到有一个接收者对象处理它。通过让更多对象有机会处理请求,避免了请求发送者和接收到之间的耦合。
责任链模式类图
demo:(销售打折)
package responsibility_chain.handler;
public abstract class PriceHandler {
//维护一个自身的类型的引用(后继),使得handler能够连接上
protected PriceHandler successor;
public void setSuccessor(PriceHandler successor) {
this.successor = successor;
}
/**
* 处理折扣
* @param dicount
*/
public abstract void processDiscount(float dicount);
public static PriceHandler createPriceHandler(){
return null;
}
}
package responsibility_chain.handler;
public class Sales extends PriceHandler {
@Override
public void processDiscount(float dicount) {
if(dicount<=0.05){
System.out.println("sales ok 0.05以下");
}else{
this.successor.processDiscount(dicount);
}
}
}
package responsibility_chain.handler;
public class Sales extends PriceHandler {
@Override
public void processDiscount(float dicount) {
if(dicount<=0.05){
System.out.println("sales ok 0.05以下");
}else{
this.successor.processDiscount(dicount);
}
}
}
package responsibility_chain.handler;
public class Director extends PriceHandler {
@Override
public void processDiscount(float dicount) {
if(dicount<=0.4){
System.out.println("Director ok 0.4以下");
}else{
this.successor.processDiscount(dicount);
}
}
}
package responsibility_chain.handler;
public class VicePresident extends PriceHandler {
@Override
public void processDiscount(float dicount) {
if(dicount<=0.5){
System.out.println("VicePresident ok 0.5以下");
}else{
this.successor.processDiscount(dicount);
}
}
}
package responsibility_chain.handler;
public class CEO extends PriceHandler {
@Override
public void processDiscount(float dicount) {
if(dicount<=0.55){
System.out.println("ceo ok 0.55以下");
}else{
System.out.println("没人能办理");
}
}
}
package responsibility_chain.handler;
public class PriceHandlerFactory {
public static PriceHandler createHandler(){
Sales sale = new Sales();
Manager manager = new Manager();
Director director = new Director();
VicePresident vicePresident = new VicePresident();
CEO ceo = new CEO();
sale.successor=manager;
manager.successor=director;
director.successor=vicePresident;
vicePresident.successor=ceo;
return sale;
}
}
测试:
package responsibility_chain;
import java.util.Random;
import org.junit.Test;
import responsibility_chain.handler.PriceHandler;
import responsibility_chain.handler.PriceHandlerFactory;
public class test {
@Test
public void testHanler() {
Customer customer = new Customer();
PriceHandler handler = PriceHandlerFactory.createHandler();
customer.setPriceHandler(handler);
for (int i = 0; i < 30; i++) {
Random random = new Random();
float nextFloat = random.nextFloat();
System.out.println("随机数" + nextFloat);
customer.requestDiscount(nextFloat);
System.out.println("--------------------------------");
}
}
}
测试结果:(部分)
随机数0.02936542
sales ok 0.05以下
--------------------------------
随机数0.026033878
sales ok 0.05以下
--------------------------------
随机数0.4851563
VicePresident ok 0.5以下
--------------------------------
随机数0.3292818
Director ok 0.4以下
--------------------------------
随机数0.6695393
没人能办理
--------------------------------
所以简单的责任链模式就这样写成了。
下面就是一些来自慕课网的资料
优点
利于解耦
发出请求的客户端并不知道链上的哪一个接收者会处理这个请求,从而实现了客户端和接收者之间的解耦
缺点:
1.时间:在单个hander对象的时间很短,但是在遍历整条链时会花费较长的时间
2.内存:在创建整条链时,会创建很多类,导致内存增加
4-1 应用案例
Java的异常机制:Exception Handling
异常是请求,调用栈中的每一级是一个handler,
这些栈中的handler共同构建成一个责任链,
栈顶元素就是上一级元素的直接后继。
JavaWeb开发过滤器链:FileterChain in Web
fileter不是纯粹的责任链模式,因为在他可以多个filter同时工作。