`

【设计模式】责任链

 
阅读更多

责任链设计模式

一般原则

当请求被责任链中某个对象处理了,则停止后续调用;否则,将请求继续往下传递。

变体

请求可以被责任链中某几个对象处理,也可以分别被每个对象处理一遍。

 

Sample1:

日志记录为例,任务会依次传递到每一个对象上,至于是否处理则由具体对象来决定:

DEBUGE级别的,只往控制台输出;

NOTICE级别的,往控制台输出,并发送邮件;

ERROR级别的,往控制台输出,并发送邮件,并将错误记录到专门的文件中;

 

 

===》顶层接口

public interface ILogger {
	void log(String msg, int priority);
}

 

===》模板方法,实现链式调用,必须持有下一个责任对象的引用

public abstract class Logger implements ILogger {
	public static final int ERR = 3;
	public static final int NOTICE = 5;
	public static final int DEBUGE = 7;
	
	protected int mask;
	
	//successor
	protected Logger nextLogger;
	
	//this can be done by use spring injection
	public void setNext(Logger logger) {
		this.nextLogger = logger;
	}
	
	//template method
	public void log(String msg, int priority) {
		if(priority <= mask)
			writeMessage(msg);
		
		//invoke next responsibility object
		if(nextLogger != null) {
			nextLogger.log(msg, priority);
		}
			
	}
	
	//how to log message all decided by subclass
	abstract protected void writeMessage(String msg);
}

 

===》责任链中的对象1:负责向控制台输出日志

public class StdoutLogger extends Logger {
	
	public StdoutLogger(int mask) {
		this.mask = mask;
	}

	@Override
	protected void writeMessage(String msg) {
		System.out.println("Writing to stdout: " + msg);
	}

}

 

===》责任链中的对象2:负责发送邮件

public class EmailLogger extends Logger {
	
	public EmailLogger(int mask) {
		this.mask = mask;
	}

	@Override
	protected void writeMessage(String msg) {
		System.out.println("Sending via e-mail: " + msg);
	}

}

 

===》责任链中的对象3:负责记录错误日志

public class StderrLogger extends Logger {
	
	public StderrLogger(int mask) {
		this.mask = mask;
	}

	@Override
	protected void writeMessage(String msg) {
		System.err.println("Sending to stderr: " + msg);
	}

}

 

===》维护责任链中处理请求的对象关系,并提供统一的外部访问

public class LogFacade {
	
	private static ILogger logger;
	
	static {
		initChain();
	}
	
	private static void initChain() {
		StdoutLogger first  = new StdoutLogger(Logger.DEBUGE);
		EmailLogger  second = new EmailLogger(Logger.NOTICE);
		StderrLogger last   = new StderrLogger(Logger.ERR);
		
		first.setNext(second);
		second.setNext(last);
		
		logger = first;
	}
	
	public void log(String msg, int priority) {
		logger.log(msg, priority);
	}
	
}

 

===》测试

public class TestChain {
	public static void main(String[] args) {
		
		LogFacade handler = new LogFacade();
		
		handler.log("Handled by StdoutLogger (level = 7)", Logger.DEBUGE);
		
		handler.log("Handled by StdoutLogger and EmailLogger (level = 5)", Logger.NOTICE);
		
		handler.log("Handled by all three loggers (level = 3)", Logger.ERR);
	}
}

 

===》输出:

Writing to stdout: Handled by StdoutLogger (level = 7)


Writing to stdout: Handled by StdoutLogger and EmailLogger (level = 5)
Sending via e-mail: Handled by StdoutLogger and EmailLogger (level = 5)


Writing to stdout: Handled by all three loggers (level = 3)
Sending via e-mail: Handled by all three loggers (level = 3)
Sending to stderr: Handled by all three loggers (level = 3)

 

======================================================================

 

Sample2:

报销审批,不同级别的人可审批金额大小不一样

Manager -> Vice President -> President

 

===》封装请求

public class PurchaseRequest {
	public long seqNo;
	public double amount;
	public String purpose;
	
	public PurchaseRequest(long seqNo, double amonut, String purpose) {
		super();
		this.seqNo = seqNo;
		this.amount = amonut;
		this.purpose = purpose;
	}
	
	
}

 

===》接口中声明顶层方法

public interface Power {
	void processRequest(PurchaseRequest request);
}

 

===》抽象类中定义模板方法 

public abstract class AbstractPower implements Power {
	
	protected static final double BASE = 1000;
	
	protected double allowable = 1 * BASE;
	
	protected Power successor;
	
	public void setNext(AbstractPower successor) {
		this.successor = successor;
	}
	
	public void processRequest(PurchaseRequest request) {
		if(request.amount < allowable)
			approve(request);
		else if(successor != null)
			successor.processRequest(request);
		else
			System.out.println("Your request for $" + request.amount + " needs a board meeting!");
	}

	protected abstract void approve(PurchaseRequest request);
}

 

===》经理级别

public class ManagerPower extends AbstractPower {
	
	public ManagerPower(Power next){
		this.allowable = 2 * BASE;
		this.successor = next;
	}

	@Override
	public void approve(PurchaseRequest request) {
		System.out.println("Manager's allowable is :" + this.allowable + ". Approve $" + request.amount);
	}

}

 

===》副总级别

public class VicePresidentPower extends AbstractPower {
	
	public VicePresidentPower(Power successor) {
		this.allowable = 5 * BASE;
		this.successor = successor;
	}

	@Override
	protected void approve(PurchaseRequest request) {
		System.out.println("VicePresident's allowable is :" + this.allowable + ". Approve $" + request.amount);
	}

}

 

===》老总级别 

public class PresidentPower extends AbstractPower {

	public PresidentPower(Power successor) {
		this.allowable = 10 * BASE;
		this.successor = successor;
	}
	
	@Override
	protected void approve(PurchaseRequest request) {
		System.out.println("President's allowable is :" + this.allowable + ". Approve $" + request.amount);
	}

}

 

===》构建责任链,从级别最小的开始提交审批 

public class CheckAuthority {
	public static void main(String[] args) {
		//初始化责任链
		Power president = new PresidentPower(null);
		Power vicePresident = new VicePresidentPower(president);
		Power manager = new ManagerPower(vicePresident);
		
		try {
			while(true) {
				System.out.println("Enter the amount to check who should approve your expenditure.");
				System.out.print(">");
				double d = Double.parseDouble(new BufferedReader(new InputStreamReader(System.in)).readLine());
				manager.processRequest(new PurchaseRequest(0, d, "General"));
			}
		} catch(Exception exc) {
			System.exit(1);
		}
	}
}

 

 

 

 

 

分享到:
评论

相关推荐

    Java设计模式责任链模式共7页.pdf.zip

    责任链模式是软件设计模式中的一种行为模式,它允许在...在上述的PDF文档"Java设计模式责任链模式共7页.pdf"中,可能会更详细地探讨这种模式的实现细节、优缺点以及适用场景,对于学习和掌握这一模式会有很大的帮助。

    设计模式专题之(十五)责任链模式---设计模式责任链模式示例代码(python--c++)

    在“设计模式专题之(十五)责任链模式---设计模式责任链模式示例代码(python--c++)”中,我们可以期待看到两种编程语言——Python和C++——实现的责任链模式。这两种实现都旨在展示如何通过构建处理请求的对象链来...

    设计模式之责任链模式Java实现

    责任链模式(Chain of Responsibility)是一种行为设计模式,它允许将请求沿着处理者对象的链进行传递,直到某个对象能够处理这个请求为止。在Java中,我们可以通过接口和类的组合来实现这种模式。让我们深入探讨...

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

    以下是关于JAVA设计模式中提及的四种模式——工厂模式、代理模式、迭代器模式以及责任链模式的详细说明。 1. **工厂模式**:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建...

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

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

    设计模式-责任链模式

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

    设计模式之责任链模式

    责任链模式是软件设计模式中的一种行为模式,它允许在对象之间传递请求,同时让多个对象有机会处理这个请求,而无需显式指定哪个对象应当处理。这种模式将发送者和接收者的耦合度降低,使得系统更加灵活,可扩展性更...

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

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

    Java 经典设计模式讲解以及项目实战

    Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...

    C#设计模式:责任链模式

    设计模式是一个老话题了,因为近在设计“网关API”组件(后续介绍),采用“责任链设计模式”进行设计,所以先进行回顾记录。  一、责任链模式介绍  责任链模式是指一个处理需要涉及多个过程或者角色参与处理,...

    java设计模式之责任链模式

    责任链模式是软件设计模式中的一种行为模式,它允许在对象之间传递请求,同时让接收者决定是否处理这个请求。这种模式将请求的发送者和接收者解耦,使得多个对象都有机会处理一个请求,而无需显式指定具体的处理者。...

    【设计模式】之责任链模式1

    责任链模式是一种行为设计模式,它允许将请求沿着处理者对象的链进行发送,而接收者可以在链中的任何位置处理该请求。这种模式的核心思想是将处理请求的对象组织成一个链条,每个对象(节点)都包含对下个处理者的...

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

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

    设计模式之责任链模式程序

    一、责任链模式 现有 “战士”、“班长”、“排长”、“连长”,“营长”五种角色,当有人要请假时要进行以下处理 1.只能是下级象上级请假(如“排长”只能向“连长请假”) 2.班长可以批准1天内的假期,排长批5天,...

    spring责任链模式详解

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

    设计模式的责任链模式的例子

    责任链模式(Chain of Responsibility Pattern)是设计模式中的一种行为模式,它的主要目的是将请求的发送者和接收者解耦,使得多个对象有机会处理这个请求,形成一条责任链。在这个链上,请求会沿着链传递,直到有...

    c++设计模式-行为型模式-责任链模式

    c++设计模式-行为型模式-责任链模式;qt工程;c++简单源码; 责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的...

    【Java设计模式-源码】责任链模式:构建强大的请求处理机制

    在 Java 开发中,责任链模式是一种重要的行为设计模式,它可以解耦请求的发送者和接收者,使多个对象都有机会处理请求。本文将详细介绍责任链模式的意图、解释、编程示例、适用场景、实际应用、优点和权衡。同时,还...

Global site tag (gtag.js) - Google Analytics