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我要告村民	村长处理了请求...

你可能感兴趣的:(java,责任链模式,村民告县长)