动态的 职责链模式

职责链模式

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

责任链模式降低了请求的发送端和接收端之间的耦合,使多个对象都有机会处理这个请求。

角色

  • 抽象处理者(Handler)角色
    定义出一个处理请求的接口。 如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色 通常由一个抽象类或接口实现
  • 具体处理者(ConcreteHandler)角色
    具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。
    由于具体处理者持有对下家的引用,因此,如果需要, 具体处理者可以访问下家。

本质

  • 分离职责,动态组合

优点

  • 请求者和接收者松散耦合
  • 动态组合职责

缺点

  • 产生很多细粒度对象
  • 不一定能被处理
    需要提供默认处理

在这里插入图片描述

处理请示的接口:

public class Handler {

	protected Handler successor;
	
	public void setSuccessor(Handler successor) {
		this.successor=successor;
	}
	public void HandleRequest(int request) {}
}

具体处理请求的类:

public class ConcreteHandler1 extends Handler {

	public void HandleRequest(int request) {
		if (request >= 0 && request < 10) {
			System.out.println("ConcreteHandler1 处理了请求" + request);
		} else if (successor != null) {
			successor.HandleRequest(request);
		}
	}
}
public class ConcreteHandler2 extends Handler {

	public void HandleRequest(int request) {
		if (request >= 10 && request < 20) {
			System.out.println("ConcreteHandler2 处理了请求" + request);
		} else if (successor != null) {
			successor.HandleRequest(request);
		}
	}
}
public class ConcreteHandler3 extends Handler {

	public void HandleRequest(int request) {
        if (request >= 20 && request < 30) {
            System.out.println("ConcreteHandler3 处理了请求" + request);
        } else if (successor != null) {
            successor.HandleRequest(request);
        }
    }
}

测试类:

public class Main {
	public static void main(String[] args) {
        Handler h1 = new ConcreteHandler1();
        Handler h2 = new ConcreteHandler2();
        Handler h3 = new ConcreteHandler3();
        h1.setSuccessor(h3);
        h3.setSuccessor(h2);

        int[] requests = {1, 2, 3, 11, 12, 13, 21, 22, 23, 99};
        for (int request : requests) {
            h1.HandleRequest(request);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫余

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值