职责链模式

来源:互联网 发布:阿里云拍照专用幕布 编辑:程序博客网 时间:2024/05/17 01:49

职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有个对象处理它为止。

UML图如下所示:

1、Handler类,定义一个处理请示的接口

public abstract class Handler{protected Handler successor;public void setSuccessor(Handler successor){this.successor = successor;}public abstract void HandleRequest(int request);}

2、ConcreteHandler类

public class ConcreteHandler1 extends Handler{@Overridepublic void HandleRequest(int request){// TODO Auto-generated method stubif(request>=0 && request<10){System.out.println("处理请求1"+request);}else if(successor!=null){successor.HandleRequest(request);}}}class ConcreteHandler2 extends Handler{@Overridepublic void HandleRequest(int request){// TODO Auto-generated method stub      if(request>=10 && request<20)      {      System.out.println("处理请求2"+request);      }      else if(successor!=null)      {    successor.HandleRequest(request);        }}}
class ConcreteHandler3 extends Handler{@Overridepublic void HandleRequest(int request){// TODO Auto-generated method stub if(request>=20 && request<30)      {      System.out.println("处理请求3"+request);      }      else if(successor!=null)      {    successor.HandleRequest(request);        }}}

3、Client类

public class Client{public static void main(String[] args){Handler h1=new ConcreteHandler1();Handler h2=new ConcreteHandler2();Handler h3=new ConcreteHandler3();h1.setSuccessor(h2);h2.setSuccessor(h3);int[] requests={2,5,14,7,22,27,20};for(int request:requests){    h1.HandleRequest(request);}}}
实例,公司各层对请假几天,拥有的权限。经理允许请假2天,总监允许请假一周,总经理允许请假半个月,UML图如下

1、Administrator类

public abstract class Administrator{protected Administrator administrator;public void setManager(Administrator administrator){this.administrator= administrator;}public abstract void request(Request request);}
2、Request类

public class Request{private String requestContent;private int requestNum;public String getRequestContent(){    return requestContent;}public void setRequestContent(String requestContent){    this.requestContent = requestContent;}public int getRequestNum(){    return requestNum;}public void setRequestNum(int requestNum){    this.requestNum = requestNum;}}

3、Manager类

public class Manager extends Administrator{@Overridepublic void request(Request req){// TODO Auto-generated method stubif(req.getRequestContent()=="请假" && req.getRequestNum()<=2){System.out.println("Manager允许请假");}else{System.out.println("Manager没有权限");if(administrator!=null){administrator.request(req);}}}}
4、ChiefInspector类

public class ChiefInspector extends Administrator{@Overridepublic void request(Request req){// TODO Auto-generated method stubif(req.getRequestContent()=="请假" && req.getRequestNum()<=7){System.out.println("Chiefinspector允许请假");}else {System.out.println("总监没有权限");if(administrator!=null){administrator.request(req);}}}}

5、GeneralManager类

public class GeneralManager extends Administrator{@Overridepublic void request(Request req){// TODO Auto-generated method stubif (req.getRequestContent() == "请假"&& req.getRequestNum() <= 15){System.out.println("GeneralMananger允许请假");}else{System.out.println("GeneralManager没有权限");if (administrator != null){administrator.request(req);}}}}
6、Client类

public class Client{public static void main(String[] args){Administrator manager=new Manager();Administrator chiefInspector=new ChiefInspector();Administrator generalManager=new GeneralManager();manager.setManager(chiefInspector);chiefInspector.setManager(generalManager);Request request=new Request();request.setRequestContent("请假");request.setRequestNum(1);manager.request(request);System.out.println("-----------");Request request3=new Request();request3.setRequestContent("请假");request3.setRequestNum(5);manager.request(request3);System.out.println("-----------");Request request4=new Request();request4.setRequestContent("请假");request4.setRequestNum(12);manager.request(request4);}}
运行结果如下:


0 0
原创粉丝点击