`
PV_love
  • 浏览: 30887 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

01_责任链模式

阅读更多
这是引用《大话设计模式》中的定义:
责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者的耦合关系,将这个对象连接成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止

适用场景:
一般比较适合应用在流程类的业务中,报销、审理、这种等级森严的制度中;

好处:增强灵活性、解耦

流程的过程可以比较方便的设置在Client或者专门的一个流程类中,可以比较方便的改流程,一下就变灵活了有木有,官方说法是增加了指派类的灵活性;

改了某个节点的逻辑也不影响其他的节点,发送者和接收者都没有对方明确的信息,且链中的自己也不知道自己的结构,结果是职责链可以简化对象的互相连接,只要你知道你的继任者是谁就行了啊;官方说法是耦合度降低;

由此我不由得感叹:真是个好模式啊
tips:不过这个模式比较要小心点地方就是,这个流程定义很重要,如果流程配错了,可能请求就中断了,不知道丢哪了,流程要cover住request的路径啊;

一般就是有个 Handler,Handler中应该有一个自身类型的实例,这个实例的作用就是,如果我处理不了,让我的这个实例去做吧;我没责任啦;快闪 还应该有一个处理request的方法requestApp();实际逻辑就在里面;


自己写了一组Java代码,以备忘
级别是 经理->总监->总经理
请短假经理批,长假总监批,大长假总经理批,嘿嘿,你要想加薪,想的美啊,总经理批
package chainOfResponsibility;

/**
 * @author ZZP 管理者抽象类
 */
public abstract class Manager {

	/**
	 * 姓名
	 */
	private String name;

	/**
	 * 继承者
	 */
	private Manager superior;

	public Manager(String name) {
		this.setName(name);
	}

	public abstract void requestApplication(Request request);

	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setSuperior(Manager superior) {
		this.superior = superior;
	}

	public Manager getSuperior() {
		return superior;
	}
}

package chainOfResponsibility;

/**
 * @author ZZP 申请
 * 
 */
public class Request {
	public Request(String requestType, String requestContent, int number) {
		super();
		this.number = number;
		this.requestContent = requestContent;
		this.requestType = requestType;
	}

	/**
	 * 数量
	 */
	private int number;
	/**
	 * 内容
	 */
	private String requestContent;
	/**
	 * 类型
	 */
	private String requestType;

	public void setNumber(int number) {
		this.number = number;
	}

	public int getNumber() {
		return number;
	}

	public void setRequestContent(String requestContent) {
		this.requestContent = requestContent;
	}

	public String getRequestContent() {
		return requestContent;
	}

	public void setRequestType(String requestType) {
		this.requestType = requestType;
	}

	public String getRequestType() {
		return requestType;
	}
}

package chainOfResponsibility;

/**
 * @author ZZP 经理
 */
public class CommonManager extends Manager {

	public CommonManager(String name) {
		super(name);
	}

	@Override
	public void requestApplication(Request request) {
		if (request.getRequestType().equals("请假") && request.getNumber() <= 2) {
			System.out.println(getName() + " :" + request.getRequestType()
					+ " " + request.getRequestContent() + " "
					+ request.getNumber() + " 被批准");
		} else {
			if (getSuperior() != null) {
				getSuperior().requestApplication(request);
			}
		}

	}
}

package chainOfResponsibility;

/**
 * @author ZZP 总监
 */
public class MajorDomo extends Manager {

	public MajorDomo(String name) {
		super(name);
	}

	@Override
	public void requestApplication(Request request) {
		if (request.getRequestType().equals("请假") && request.getNumber() <= 5) {
			System.out.println(getName() + " :" + request.getRequestType()
					+ " " + request.getRequestContent() + " "
					+ request.getNumber() + " 被批准");
		} else {
			if (getSuperior() != null) {
				getSuperior().requestApplication(request);
			}
		}
	}

}

package chainOfResponsibility;

/**
 * @author ZZP 总经理
 */
public class GerneralManager extends Manager {

	public GerneralManager(String name) {
		super(name);
	}

	@Override
	public void requestApplication(Request request) {
		if (request.getRequestType().equals("请假")) {
			System.out.println(getName() + " :" + request.getRequestType()
					+ " " + request.getRequestContent() + " "
					+ request.getNumber() + " 被批准");
		} else if (request.getRequestType().equals("加薪")
				&& request.getNumber() <= 500) {
			System.out.println(getName() + " :" + request.getRequestType()
					+ " " + request.getRequestContent() + " "
					+ request.getNumber() + " 被批准");
		} else if (request.getRequestType().equals("加薪")
				&& request.getNumber() > 500) {
			System.out.println(getName() + " :" + request.getRequestType()
					+ " " + request.getRequestContent() + " "
					+ request.getNumber() + " 再说吧");
		}
	}

}

package chainOfResponsibility;

public class TestChainOfResponsibility {
	public static void main(String args[]) {

		CommonManager jingli = new CommonManager("经理");
		MajorDomo zongjian = new MajorDomo("总监");
		GerneralManager zongjingli = new GerneralManager("总经理");
		jingli.setSuperior(zongjian);
		zongjian.setSuperior(zongjingli);

		Request req1 = new Request("请假", "小李肚子疼", 1);
		Request req2 = new Request("请假", "小张堵车", 4);
		Request req3 = new Request("请假", "小王生病了", 10);
		Request req4 = new Request("加薪", "小赵要加薪", 500);
		Request req5 = new Request("加薪", "小小要加薪", 1500);

		jingli.requestApplication(req1);
		jingli.requestApplication(req2);
		jingli.requestApplication(req3);
		jingli.requestApplication(req4);
		jingli.requestApplication(req5);
	}

}


结果就是:
经理 :请假 小李肚子疼 1 被批准
总监 :请假 小张堵车 4 被批准
总经理 :请假 小王生病了 10 被批准
总经理 :加薪 小赵要加薪 500 被批准
总经理 :加薪 小小要加薪 1500 再说吧
分享到:
评论

相关推荐

    设计模式_行为型_责任链模式.md

    行为型设计模式中的一种——责任链模式,它提供了一种优雅的方式来处理对象间的通信,尤其是当多个对象都可能处理一个请求,且具体处理的哪个对象在运行时才能决定时。本文将详细介绍责任链模式的定义、角色组成、...

    spring责任链模式详解

    责任链模式是软件设计模式中的一种行为模式,它允许将请求沿着处理者对象的链进行传递,直到某个对象处理该请求。在Spring框架中,责任链模式被广泛应用于AOP(面向切面编程)和事件处理等场景。下面将详细阐述责任...

    责任链模式(Chain of Responsibility Pattern) 1. 责任链模式概述 1.1 定义 1.2 基本思想 2. 责任链模式的结构 3. 责任链模式的UML类图 4. 责任链模

    责任链模式(Chain of Responsibility Pattern) 1. 责任链模式概述 1.1 定义 1.2 基本思想 2. 责任链模式的结构 3. 责任链模式的UML类图 4. 责任链模式的工作原理 5. Java实现示例 5.1 基本实现示例 5.2 使用接口...

    设计模式之责任链模式源码

    责任链模式是设计模式中的一种行为模式,它允许在对象之间建立一条处理请求的链条,每个对象都包含对请求的处理逻辑,以及将请求传递给下一个对象的能力。这种模式使得请求可以在链上的对象之间传递,直到被某个对象...

    责任链模式_javaDemo

    责任链模式(Chain of Responsibility)的目标是使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。 在处理用户的...

    设计模式-责任链模式

    责任链模式是一种行为设计模式,它允许我们把请求沿着处理者对象的链式结构进行传递,直到某个对象处理这个请求。这种模式使得我们能够将请求的发送者与接收者解耦,同时也允许在运行时动态地改变处理顺序或添加新的...

    责任链模式代码

    责任链模式是一种设计模式,它允许我们把请求沿着处理者对象的链进行传递,直到某个对象处理这个请求。这种模式让请求的发送者和接收者解耦,因为发送者无需知道哪个对象会处理请求,而接收者也无需知道请求来自哪里...

    JAVA 设计模式 工厂模式 代理模式 迭代模式 责任链模式 源码

    4. **责任链模式**:责任链模式是行为型设计模式,它使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合。在这个模式中,请求沿着处理者链进行传递,每个处理者都有机会处理请求,或者将请求传递...

    第17章_职责链模式.ppt

    【职责链模式】是行为型模式的一种,其主要动机是解耦请求的发送者和处理者。在职责链中,多个对象可以接收并处理同一个请求,这些对象形成一条链,请求沿着链传递,直到某个对象负责处理。这种方式减少了对象间的...

    责任链模式Demo

    责任链模式是一种设计模式,它允许我们通过定义一系列处理请求的对象来形成一条链,每个对象都包含对请求的处理逻辑,以及将请求传递给链中下一个对象的能力。这种模式使得我们可以将请求的发送者和接收者解耦,使得...

    职责链模式-基本代码.rar_C#_职责链模式

    职责链模式是一种设计模式,它允许我们沿着一个对象链来传递请求,每个对象都可以处理请求,也可以将请求传递给链中的下一个对象。这种模式在处理事件流或责任分发时非常有用,它使得代码更加灵活,降低了耦合度。在...

    责任链模式学习

    责任链模式是一种行为设计模式,它允许我们定义一系列处理请求的对象,这些对象形成一个链,请求沿着这个链传递,直到某个对象能够处理它。这种方式使得我们可以将请求的发送者和接收者解耦,同时增加了系统扩展的...

    设计模式之责任链模式

    责任链模式是一种行为设计模式,它允许我们把请求沿着处理者链进行传递,直到某个处理者处理这个请求。这种模式让请求的发送者和接收者解耦,因为发送者无需知道哪个对象会处理请求,接收者也不知道其他处理者的存在...

    JAVA设计模式之行为模式 责任链模式和状态模式

    本篇将探讨两种重要的行为设计模式:责任链模式(Chain of Responsibility Pattern)和状态模式(State Pattern)。 **责任链模式**是一种使多个对象都有机会处理请求的模式,避免请求发送者与接收者之间的耦合。在...

    设计模式之责任链模式(Chain)

    责任链模式是一种行为设计模式,它的核心思想是将请求的发送者和接收者解耦,通过将多个处理对象串联成一个处理链,使得请求沿着这个链进行传递,直到被某个对象处理。这种模式使得系统更加灵活,可以在运行时动态...

    责任链模式Simple

    责任链模式(Chain of Responsibility)是一种行为设计模式,它的核心思想是将一系列处理请求的对象组织成一条链,并在链上的每个对象中定义处理请求的方法。当一个请求沿着链传递时,每个对象都有机会处理该请求,...

    责任链模式例子

    责任链模式是一种设计模式,它允许我们通过定义一系列处理请求的对象来解耦发送者和接收者。在责任链模式中,每个对象都是链上的一个节点,可以处理请求的一部分或者将请求传递给链上的下一个对象。这种模式使得系统...

    责任链模式 C++ 实现

    责任链模式是一种设计模式,它允许我们通过定义一系列处理对象(每个对象称为一个节点),将请求在这些对象之间传递,直到被某个节点处理或者传递完整个链条。这种模式的主要优点在于解耦了发送者和接收者,使得系统...

    责任链模式小demo

    责任链模式是一种设计模式,它允许我们通过定义一系列处理对象(过滤器)形成一个链,这些对象依次处理请求,而发送者无需知道哪个对象具体处理请求。这种模式将请求的发送者与接收者解耦,增加了系统的灵活性和可...

Global site tag (gtag.js) - Google Analytics