职责链模式

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

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);
}
}
运行结果如下:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值