package ChainofResponsibility.MyTest;
public class MyTest {
/**Chain of Responsibility(责任链)
* @param args
*/
public static void main(String[] args) {
AbstractRequest ar1=new CookRequest("发出做饭命令");
AbstractRequest ar2=new EatRequest("发出吃饭命令");
AbstractRequest ar3=new WishRequest("发出洗碗命令");
AbstractHandler ah1=new CookHandler();
AbstractHandler ah2=new EatHandler();
AbstractHandler ah3=new WishHandler();
ah1.setNextRequest(ah2);
ah2.setNextRequest(ah3);
ah1.Handler(ar1);
// ah1.HandlerRequest(ar3);
}
}
package ChainofResponsibility.MyTest;
public enum Level {
LEVEL_1, LEVEL_2, LEVEL_3, LEVEL_4, LEVEL_5, LEVEL_6, LEVEL_7;
private int reutrnLevel(Level rl) {
switch (rl) {
case LEVEL_1:
return 1;
case LEVEL_2:
return 2;
case LEVEL_3:
return 3;
case LEVEL_4:
return 4;
case LEVEL_5:
return 5;
case LEVEL_6:
return 6;
case LEVEL_7:
return 7;
}
return 0;
}
public byte CompareSuper(Level rl)
{
if(reutrnLevel(this)>reutrnLevel(rl))
{
return 1;
}else if(reutrnLevel(this)==reutrnLevel(rl))
{
return 0;
}else{
return -1;
}
}
}
package ChainofResponsibility.MyTest;
public abstract class AbstractHandler {
AbstractHandler nexthandler;
public void setNextRequest(AbstractHandler nexthandler) {
this.nexthandler = nexthandler;
}
/** 按一定的方法处理请求 * */
public final void HandlerRequest(AbstractRequest request) {
if (request.getRequestLevel() == this.getHandlerLevel()) {
this.Handler(request);
return;
} else {
if(nexthandler != null)
{
if(request.getRequestLevel().CompareSuper(this.nexthandler.getHandlerLevel())==1)
{
System.out.println("方法不能直接执行"+request.getContent()+",必须先执行前一个任务:\n"+this.nexthandler.getContent());
this.nexthandler.HandlerRequest(request);
}else if(request.getRequestLevel().CompareSuper(this.nexthandler.getHandlerLevel())==0){
System.out.println("可以执行方法:");
this.nexthandler.Handler(request);
}else{
System.out.println("不符合逻辑的任务");
}
}else{
if(request.getRequestLevel().CompareSuper(this.getHandlerLevel())==-1)
{
System.out.println("不符合逻辑的任务");
}else{
System.out.println("无法完成任务");
}
}
}
}
public abstract String getContent();
public abstract Level getHandlerLevel();
/** 具体请求的方法 * */
public abstract void Handler(AbstractRequest request);
}
package ChainofResponsibility.MyTest;
public class CookHandler extends AbstractHandler {
@Override
public void Handler(AbstractRequest request) {
System.out.println("正在做饭");
}
@Override
public Level getHandlerLevel() {
return Level.LEVEL_1;
}
@Override
public String getContent() {
// TODO Auto-generated method stub
return "正在做饭";
}
}
package ChainofResponsibility.MyTest;
public class EatHandler extends AbstractHandler {
@Override
public void Handler(AbstractRequest request) {
// TODO Auto-generated method stub
System.out.println("正在吃饭");
}
@Override
public Level getHandlerLevel() {
// TODO Auto-generated method stub
return Level.LEVEL_2;
}
@Override
public String getContent() {
// TODO Auto-generated method stub
return "正在吃饭";
}
}
package ChainofResponsibility.MyTest;
public class WishHandler extends AbstractHandler {
@Override
public void Handler(AbstractRequest request) {
System.out.println("正在洗碗");
}
@Override
public Level getHandlerLevel() {
return Level.LEVEL_3;
}
@Override
public String getContent() {
// TODO Auto-generated method stub
return "正在洗碗";
}
}
package ChainofResponsibility.MyTest;
public abstract class AbstractRequest {
String content;
public AbstractRequest(String content) {
this.content = content;
}
public abstract Level getRequestLevel();
public String getContent() {
return content;
}
}
package ChainofResponsibility.MyTest;
public class CookRequest extends AbstractRequest {
public CookRequest(String content) {
super(content);
}
@Override
public Level getRequestLevel() {
return Level.LEVEL_1;
}
}
package ChainofResponsibility.MyTest;
public class EatRequest extends AbstractRequest {
public EatRequest(String content) {
super(content);
}
@Override
public Level getRequestLevel() {
return Level.LEVEL_2;
}
}
package ChainofResponsibility.MyTest;
public class WishRequest extends AbstractRequest {
public WishRequest(String content) {
super(content);
}
@Override
public Level getRequestLevel() {
return Level.LEVEL_3;
}
}