职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有个对象处理它为止。
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
{
@Override
public void HandleRequest(int request)
{
// TODO Auto-generated method stub
if(request>=0 && request<10)
{
System.out.println("处理请求1"+request);
}
else if(successor!=null)
{
successor.HandleRequest(request);
}
}
}
class ConcreteHandler2 extends Handler
{
@Override
public 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
{
@Override
public 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
{
@Override
public void request(Request req)
{
// TODO Auto-generated method stub
if(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
{
@Override
public void request(Request req)
{
// TODO Auto-generated method stub
if(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
{
@Override
public void request(Request req)
{
// TODO Auto-generated method stub
if (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);
}
}
运行结果如下: