1. 程式人生 > >【JAVA設計模式】職責鏈模式

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

}