`
3213213333332132
  • 浏览: 79910 次
社区版块
存档分类
最新评论

java责任链模式

阅读更多
责任链模式,通常就是一个请求从最低级开始往上层层的请求,当在某一层满足条件时,请求将被处理,当请求到最高层仍未满足时,则请求不会被处理。

就是一个请求在这个链条的责任范围内,会被相应的处理,如果超出链条的责任范围外,请求不会被相应的处理。

下面代码模拟这样的效果:
创建一个政府抽象类,方便所有的具体政府部门继承它。
package 责任链模式;

/**
 * 
 * 政府抽象类
 * @Description
 * @author FuJianyong
 * 2015-5-23下午03:37:44
 */
public abstract class Government {

	/**
	 * 后继
	 */
	protected Government successor;
	
	public void setSuccessor(Government successor){
		this.successor = successor;
	}
	
	/**
	 * 处理请求
	 * @param name
	 */
	abstract void requestAccess(String name);
	
}



创建具体的政府部门

package 责任链模式;

import java.text.SimpleDateFormat;

/**
 * 村长
 * @Description
 * @author FuJianyong
 * 2015-5-23下午03:45:21
 */
public class VillageMaster extends Government {

	private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	
	@Override
	void requestAccess(String name) {
		if(name.equals("我要告村民")){
			System.out.println(sdf.format(System.currentTimeMillis()) + name + "\t村长处理了请求...");
		}
		else{
			//如果不是村内的事,村长把处理请求转到上一级
			System.out.println(sdf.format(System.currentTimeMillis()) + name + "\t村长把处理请求转到上一级");
			this.successor.requestAccess(name);
		}
	}

}


package 责任链模式;

import java.text.SimpleDateFormat;

/**
 * 镇长
 * @Description
 * @author FuJianyong
 * 2015-5-23下午03:45:21
 */
public class TownMaster extends Government {

	private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	
	@Override
	void requestAccess(String name) {
		if(name.equals("我要告村长")){
			System.out.println(sdf.format(System.currentTimeMillis()) + name + "\t镇长处理了请求...");
		}
		else{
			//如果不是镇内的事,镇长把处理请求转到上一级
			System.out.println(sdf.format(System.currentTimeMillis()) + name + "\t镇长把处理请求转到上一级");
			this.successor.requestAccess(name);
		}
	}

}


package 责任链模式;

import java.text.SimpleDateFormat;

/**
 * 县长
 * @Description
 * @author FuJianyong
 * 2015-5-23下午03:45:21
 */
public class CountyMaster extends Government {

	private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	
	@Override
	void requestAccess(String name) {
		if(name.equals("我要告镇长")){
			System.out.println(sdf.format(System.currentTimeMillis()) + name + "\t县长处理了请求...");
		}
		else{
			System.out.println(sdf.format(System.currentTimeMillis()) + name + "\t哼...天高皇帝远.县长拒绝请求!");
		}
	}

}




创建一个政府工厂来创建政府
package 责任链模式;

/**
 * 政府工厂
 * @Description
 * @author FuJianyong
 * 2015-5-23下午03:53:39
 */
public class GovernmentFactory {
    
	/**
	 * 创建政府部门
	 * @return
	 */
	public static Government createGovernment(){
		
		VillageMaster villageMaster = new VillageMaster();
		TownMaster townMaster = new TownMaster();
		CountyMaster countyMaster = new CountyMaster();
		
		//设置它们的后继
		villageMaster.setSuccessor(townMaster);
		townMaster.setSuccessor(countyMaster);
		
		return villageMaster;
	}
}



最后创建一个村民去发出请求
看看这些政府部门责任链条怎么处理村民的请求。
package 责任链模式;

import java.text.SimpleDateFormat;
import java.util.Random;

/**
 * 村民
 * @Description
 * @author FuJianyong
 * 2015-5-23下午03:58:42
 */
public class VillageMan {	

	private Government government;
	
	private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	
	private static final String[] requests = new String[]{"我要告村民", "我要告村长", "我要告镇长", "我要告县长"};

	/**
	 * 设置将要请求的政府部门
	 * 
	 * @param government
	 */
	public void setGovernment(Government government){
		this.government = government;
	}
	
	/**
	 * 村民请求
	 * 
	 * @param name 
	 */
	public void requestAccess(String name){
		this.government.requestAccess(name);
	}
	//test...
	public static void main(String[] args) {
		for(;;){
			requestAccess();
			//每隔一段20s执行一次循环的处理请求
			try {
				Thread.sleep(20 * 1000);
			} catch (final InterruptedException e) {
				e.printStackTrace();
			}
		}
		
	}
	/**
	 * 随机的循环的处理请求
	 */
	private static void requestAccess(){
		final VillageMan villageMan = new VillageMan();
		//创建一个政府从最低级的政府部门开始向上请求
		villageMan.setGovernment(GovernmentFactory.createGovernment());

		//给告县长增加难度
		int difficult = 0;
		for(;;){
			
			int requestNum = requests.length;
			int random = new Random().nextInt(requestNum);
			while(random == requestNum - 1){
				//要出现三次告县长才能告到县长。
				if(difficult > 2){
					difficult = 0; break;
				}
				System.out.println(sdf.format(System.currentTimeMillis()) + requests[random] + "\t回去吧,今天县长出差了。");
				random = new Random().nextInt(requestNum);
				difficult++;
			}
			villageMan.requestAccess(requests[random]);
                        //请求失败后退出循环
			if(requests[random].equals("我要告县长")){
				System.out.println("休息三个月...");
				break;
			}
			try {
				Thread.sleep(1000);
			} catch (final InterruptedException e) {
				e.printStackTrace();
			}

		}
	}
}



运行的效果:
2015-07-08 14:43:51我要告镇长	村长把处理请求转到上一级
2015-07-08 14:43:51我要告镇长	镇长把处理请求转到上一级
2015-07-08 14:43:51我要告镇长	县长处理了请求...
2015-07-08 14:43:52我要告村民	村长处理了请求...
2015-07-08 14:43:53我要告村民	村长处理了请求...
2015-07-08 14:43:54我要告镇长	村长把处理请求转到上一级
2015-07-08 14:43:54我要告镇长	镇长把处理请求转到上一级
2015-07-08 14:43:54我要告镇长	县长处理了请求...
2015-07-08 14:43:55我要告县长	回去吧,今天县长出差了。
2015-07-08 14:43:55我要告镇长	村长把处理请求转到上一级
2015-07-08 14:43:55我要告镇长	镇长把处理请求转到上一级
2015-07-08 14:43:55我要告镇长	县长处理了请求...
2015-07-08 14:43:56我要告镇长	村长把处理请求转到上一级
2015-07-08 14:43:56我要告镇长	镇长把处理请求转到上一级
2015-07-08 14:43:56我要告镇长	县长处理了请求...
2015-07-08 14:43:57我要告县长	回去吧,今天县长出差了。
2015-07-08 14:43:57我要告镇长	村长把处理请求转到上一级
2015-07-08 14:43:57我要告镇长	镇长把处理请求转到上一级
2015-07-08 14:43:57我要告镇长	县长处理了请求...
2015-07-08 14:43:58我要告镇长	村长把处理请求转到上一级
2015-07-08 14:43:58我要告镇长	镇长把处理请求转到上一级
2015-07-08 14:43:58我要告镇长	县长处理了请求...
2015-07-08 14:43:59我要告县长	回去吧,今天县长出差了。
2015-07-08 14:43:59我要告村民	村长处理了请求...
2015-07-08 14:44:00我要告县长	村长把处理请求转到上一级
2015-07-08 14:44:00我要告县长	镇长把处理请求转到上一级
2015-07-08 14:44:00我要告县长	哼...天高皇帝远.县长拒绝请求!
休息三个月...
2015-07-08 14:44:20我要告县长	回去吧,今天县长出差了。
2015-07-08 14:44:20我要告镇长	村长把处理请求转到上一级
2015-07-08 14:44:20我要告镇长	镇长把处理请求转到上一级
2015-07-08 14:44:20我要告镇长	县长处理了请求...
2015-07-08 14:44:21我要告村长	村长把处理请求转到上一级
2015-07-08 14:44:21我要告村长	镇长处理了请求...
2015-07-08 14:44:22我要告村民	村长处理了请求...
2015-07-08 14:44:23我要告村长	村长把处理请求转到上一级
2015-07-08 14:44:23我要告村长	镇长处理了请求...
2015-07-08 14:44:24我要告村长	村长把处理请求转到上一级
2015-07-08 14:44:24我要告村长	镇长处理了请求...
2015-07-08 14:44:25我要告村长	村长把处理请求转到上一级
2015-07-08 14:44:25我要告村长	镇长处理了请求...
2015-07-08 14:44:26我要告村长	村长把处理请求转到上一级
2015-07-08 14:44:26我要告村长	镇长处理了请求...
2015-07-08 14:44:27我要告村民	村长处理了请求...
2015-07-08 14:44:28我要告村民	村长处理了请求...
2015-07-08 14:44:29我要告村长	村长把处理请求转到上一级
2015-07-08 14:44:29我要告村长	镇长处理了请求...
2015-07-08 14:44:30我要告县长	回去吧,今天县长出差了。
2015-07-08 14:44:30我要告县长	回去吧,今天县长出差了。
2015-07-08 14:44:30我要告县长	村长把处理请求转到上一级
2015-07-08 14:44:30我要告县长	镇长把处理请求转到上一级
2015-07-08 14:44:30我要告县长	哼...天高皇帝远.县长拒绝请求!
休息三个月...
2015-07-08 14:44:50我要告村长	村长把处理请求转到上一级
2015-07-08 14:44:50我要告村长	镇长处理了请求...
2015-07-08 14:44:51我要告县长	回去吧,今天县长出差了。
2015-07-08 14:44:51我要告县长	回去吧,今天县长出差了。
2015-07-08 14:44:51我要告村长	村长把处理请求转到上一级
2015-07-08 14:44:51我要告村长	镇长处理了请求...
2015-07-08 14:44:52我要告镇长	村长把处理请求转到上一级
2015-07-08 14:44:52我要告镇长	镇长把处理请求转到上一级
2015-07-08 14:44:52我要告镇长	县长处理了请求...
2015-07-08 14:44:53我要告村长	村长把处理请求转到上一级
2015-07-08 14:44:53我要告村长	镇长处理了请求...
2015-07-08 14:44:54我要告村长	村长把处理请求转到上一级
2015-07-08 14:44:54我要告村长	镇长处理了请求...
2015-07-08 14:44:55我要告村民	村长处理了请求...
2015-07-08 14:44:56我要告镇长	村长把处理请求转到上一级
2015-07-08 14:44:56我要告镇长	镇长把处理请求转到上一级
2015-07-08 14:44:56我要告镇长	县长处理了请求...
2015-07-08 14:44:57我要告镇长	村长把处理请求转到上一级
2015-07-08 14:44:57我要告镇长	镇长把处理请求转到上一级
2015-07-08 14:44:57我要告镇长	县长处理了请求...
2015-07-08 14:44:58我要告县长	回去吧,今天县长出差了。
2015-07-08 14:44:58我要告村长	村长把处理请求转到上一级
2015-07-08 14:44:58我要告村长	镇长处理了请求...
2015-07-08 14:44:59我要告村民	村长处理了请求...
2
1
分享到:
评论

相关推荐

    java 责任链模式

    在Java中,责任链模式可以帮助我们实现松耦合,使得请求处理者与请求发起者之间无需直接交互,同时也允许动态地增加或修改处理请求的对象。 责任链模式的主要组成部分包括: 1. **处理者(Handler)**:这是链上的...

    java责任链模式的财务审批功能实现

    责任链模式是一种设计模式,它在Java编程中广泛应用于创建可扩展和灵活的系统。该模式的核心思想是将处理请求的过程分解为一系列相互链接的处理对象,形成一条处理链。当一个请求进入链条时,它会沿着链路传递,每个...

    深入浅出JAVA责任链模式

    ### 深入浅出JAVA责任链模式 #### 一、引言 责任链模式是一种在软件设计领域中常见的设计模式之一,它主要用于处理请求的传递过程,通过一系列的处理者对象来完成请求的处理任务。本文将详细介绍JAVA中的责任链...

    java设计模式-责任链模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...

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

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

    java 责任链模式 可以累积前一步操作结果和参数

    在Java中,通过责任链模式,我们可以将多个处理者对象串联起来,每个处理者都有机会处理请求,或者将请求传递给下一个处理者。这种模式的优点在于解耦了发送者和接收者,使得系统更具灵活性,能够添加、删除或改变...

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

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

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

    让我们深入探讨一下责任链模式的概念、工作原理以及如何用Java来实现它。 责任链模式的核心思想是将请求的发送者和接收者解耦,发送者只需要知道链的存在,而不需要了解链上的具体处理者。每个处理者对象都包含对下...

    java常用设计模式-责任链模式

    Java 责任链模式详解 责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将请求沿着处理链进行传递,直到有一个处理程序处理它为止。在 Java 中实现责任链模式通常需要以下几个步骤: 定义...

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

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

    Java责任链模式模板代码分享

    Java责任链模式模板代码分享 Java责任链模式是一种常见的设计模式,用于处理请求的处理和分发。它允许多个处理者对请求进行处理,并且可以根据需要将请求传递给下一个处理者。本文将分享一个Java责任链模式模板代码...

    Java责任链模式定义与用法分析

    Java责任链模式定义与用法分析 Java责任链模式是指在处理某个请求时,将多个处理对象连接成一条链,每个处理对象都有机会处理该请求,直到有一个对象处理该请求为止。这种模式可以避免请求的发送者和接受者之间的...

    java设计模式之责任链模式

    在“java设计模式之责任链模式”的主题中,我们可以深入探讨如何在实际项目中应用责任链模式,包括但不限于以下方面: 1. **代码结构优化**:通过责任链模式,可以使代码结构更加清晰,降低类间的耦合度。 2. **可...

    责任链模式例子

    在《Head First Design Patterns》文中是这么介绍责任链模式的,“通过责任链模式,你可以为某个请求创建一个对象链。每个对象依次检查此请求,并对其进行处理,或者将它传给链中的下一个对象”,这句话已经很好了解...

    Java模式之责任链

    责任链模式是一种行为设计模式,它允许将请求沿着处理者对象的链进行传递,直到某个对象能够处理这个请求。在Java中,这种模式常用于事件处理或者分层处理系统,例如在Spring框架的AOP切面处理中就有所体现。 在...

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

    2 责任链模式 3 策略模式 4 模板方法模式 5 工厂方法模式 6 抽象工厂模式 7 建造者模式 8 代理模式 9 装饰模式 10 原型模式 11 委派模式 12 适配器模式 设计模式综合运用 1 门面+模版方法+责任链+策略 2 门面+模版...

    责任链模式_javaDemo

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

    JAVA责任链与命令模式

    ### JAVA责任链与命令模式详解 #### 一、引言 设计模式是在软件工程领域内广泛应用的一种编程思想,它能够帮助开发者解决常见的编程难题。在众多设计模式中,行为模式是一大类重要的模式,它主要关注于如何描述...

    Java 23种设计模式17职责链模式.pdf

    ### Java设计模式详解:职责链模式 #### 行为型模式概述 行为型设计模式着重于定义对象间的职责分配及算法的抽象化。不同于结构型模式关注类和对象的组合,行为型模式更注重对象之间的交互与职责划分,强调的是在...

Global site tag (gtag.js) - Google Analytics