责任链模式,通常就是一个请求从最低级开始往上层层的请求,当在某一层满足条件时,请求将被处理,当请求到最高层仍未满足时,则请求不会被处理。
就是一个请求在这个链条的责任范围内,会被相应的处理,如果超出链条的责任范围外,请求不会被相应的处理。
下面代码模拟这样的效果:
创建一个政府抽象类,方便所有的具体政府部门继承它。
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我要告村民 村长处理了请求...