【JAVA设计模式】职责链模式

一、定义

职责链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
如类图所示,当客户提交一个请求时,请求时沿链传递直至有一个ConcreteHandler对象负责处理它。接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构,结果时职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选接受者的引用。这也是大大降低了耦合度。

二、UML类图

职责链模式UML类图

三、实现

  • 抽象职责类
package com.jthao.design.des.chain;

public abstract class Manager {

	protected String name;

	protected Manager superior;

	public Manager(String name) {
		this.name = name;
	}

	public void setSuperior(Manager superior) {
		this.superior = superior;
	}
	
	public abstract void requestApplications(Request request);

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Manager getSuperior() {
		return superior;
	}

}
  • 第一级处理类
package com.jthao.design.des.chain;

public class CommonManager extends Manager {

	public CommonManager(String name) {
		super(name);
	}

	@Override
	public void requestApplications(Request request) {
		if (request.getRequestType().equals("请假") && request.getRequestNum() <= 2) {
			System.out.println("CommonManager  请假批准");
		} else {
			superior.requestApplications(request);
		}
	}

}
  • 第二级处理类
package com.jthao.design.des.chain;

public class Majordomo extends Manager {

	public Majordomo(String name) {
		super(name);
	}

	@Override
	public void requestApplications(Request request) {
		if (request.getRequestType().equals("请假") && request.getRequestNum() <= 5) {
			System.out.println("Majordomo  请假批准");
		} else {
			superior.requestApplications(request);
		}
	}

}
  • 第三级处理类
package com.jthao.design.des.chain;

public class GeneralManager extends Manager {

	public GeneralManager(String name) {
		super(name);
	}

	@Override
	public void requestApplications(Request request) {
		if (request.getRequestType().equals("请假")) {
			System.out.println("GeneralManager  请假批准");
		} else if (request.getRequestType().equals("加薪") && request.getRequestNum() <= 500) {
			System.out.println("GeneralManager  加薪批准");
		} else if (request.getRequestType().equals("加薪") && request.getRequestNum() > 500) {
			System.out.println("GeneralManager  在考虑考虑");
		}
	}

}
  • 引用类
package com.jthao.design.des.chain;

public class Request {

	private String requestType;

	private String requestContent;

	private int requestNum;

	public String getRequestType() {
		return requestType;
	}

	public void setRequestType(String requestType) {
		this.requestType = requestType;
	}

	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;
	}

}
  • 测试类
package com.jthao.design.des.chain;

public class Test {

	public static void main(String[] args) {
		CommonManager commonManager = new CommonManager("经理");
		Majordomo majordomo = new Majordomo("总监");
		GeneralManager generalManager = new GeneralManager("总经理");
		
		commonManager.setSuperior(majordomo);
		majordomo.setSuperior(generalManager);
		
		Request request = new Request();
		request.setRequestContent("小兰请假");
		request.setRequestNum(2);
		request.setRequestType("请假");
		commonManager.requestApplications(request);
		
		request.setRequestNum(3);
		commonManager.requestApplications(request);
		
		request.setRequestNum(10);
		commonManager.requestApplications(request);
		
		request.setRequestContent("小兰加薪");
		request.setRequestNum(500);
		request.setRequestType("加薪");
		commonManager.requestApplications(request);
		
		request.setRequestNum(2000);
		commonManager.requestApplications(request);
	}

}

猜你喜欢

转载自blog.csdn.net/haobao528/article/details/85270184
今日推荐