欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java责任链模式

程序员文章站 2022-05-04 08:40:28
...
责任链模式,通常就是一个请求从最低级开始往上层层的请求,当在某一层满足条件时,请求将被处理,当请求到最高层仍未满足时,则请求不会被处理。

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

下面代码模拟这样的效果:
创建一个*抽象类,方便所有的具体*部门继承它。
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我要告村民	村长处理了请求...