国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

設(shè)計(jì)模式——責(zé)任鏈模式

這篇具有很好參考價(jià)值的文章主要介紹了設(shè)計(jì)模式——責(zé)任鏈模式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

責(zé)任鏈模式

定義

使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免了請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系。將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,知道有對(duì)象處理它為止。

優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

能將請(qǐng)求和處理分開。請(qǐng)求者可以不用知道是誰(shuí)處理的,處理者可以不用知道請(qǐng)求的全貌,兩者解耦提高系統(tǒng)的靈活性

缺點(diǎn)

  1. 性能問題,每個(gè)請(qǐng)求都是從鏈頭遍歷到鏈尾,尤其是鏈較長(zhǎng)的時(shí)候,會(huì)有性能方面的影響。
  2. 調(diào)試不方便,由于采用了類似遞歸的方式(本實(shí)驗(yàn)用的是隊(duì)列的遍歷),調(diào)試的時(shí)候會(huì)比較復(fù)雜。

實(shí)驗(yàn)小結(jié)

  1. 即一個(gè)任務(wù)到來(lái)時(shí),進(jìn)入責(zé)任鏈,從頭開始遍歷責(zé)任人,不是則依次往下尋找,直到找到負(fù)責(zé)該任務(wù)的責(zé)任人(可能無(wú)人負(fù)責(zé))
  2. 將責(zé)任鏈節(jié)點(diǎn)依次加入隊(duì)列就能build()出責(zé)任鏈關(guān)系。

代碼模擬場(chǎng)景

項(xiàng)目進(jìn)入測(cè)試階段,項(xiàng)目組出現(xiàn)問題,依次尋找測(cè)試、開發(fā)、產(chǎn)品經(jīng)理尋求幫助。

責(zé)任鏈模式

UML圖

設(shè)計(jì)模式——責(zé)任鏈模式,設(shè)計(jì)模式,設(shè)計(jì)模式,責(zé)任鏈模式,java

責(zé)任鏈節(jié)點(diǎn)抽象、實(shí)現(xiàn)類

public abstract class AbstractHandler {
	/**
	 * 測(cè)試處理等級(jí)
	 */
	public final static int TEST_LEVEL_REQUEST = 1;
	/**
	 * 開發(fā)處理等級(jí)
	 */
	public final static int DEVELOPER_LEVEL_REQUEST = 2;
	/**
	 * 產(chǎn)品經(jīng)理處理等級(jí)
	 */
	public final static int PRODUCT_MANAGER_LEVEL_REQUEST = 3;
	/**
	 * 能處理的級(jí)別
	 */
	private final int level;
	/**
	 * 責(zé)任傳遞,下個(gè)責(zé)任人是誰(shuí)
	 */
	private AbstractHandler nextHandler;

	/**
	 * 每個(gè)責(zé)任節(jié)點(diǎn)都要說(shuō)明下自己能處理哪些需求
	 *
	 * @param level 處理等級(jí)
	 */
	public AbstractHandler(int level) {
		this.level = level;
	}

	/**
	 * 處理項(xiàng)目的要求
	 *
	 * @param project 項(xiàng)目需要
	 */
	public final void handleMessage(IProject project) {
		if (project.getType() == this.level) {
			this.response(project);
		} else {
			// 后續(xù)有環(huán)節(jié)則繼續(xù)推進(jìn)請(qǐng)求
			if (this.nextHandler != null) {
				this.nextHandler.handleMessage(project);
			} else {
				System.out.println("已無(wú)流程批示,不同意");
			}
		}
	}

	/**
	 * 傳遞給下個(gè)處理人
	 *
	 * @param handler 下個(gè)處理人
	 */
	public void setNext(AbstractHandler handler) {
		this.nextHandler = handler;
	}

	/**
	 * 處理人的回應(yīng)
	 *
	 * @param project 項(xiàng)目對(duì)象
	 */
	protected abstract void response(IProject project);
}


/**
 * @author Evad.Wu
 * @Description 測(cè)試工程師
 * @date 2023-07-10
 */
public class TestEngineer extends AbstractHandler {
	/**
	 * 每個(gè)責(zé)任節(jié)點(diǎn)都要說(shuō)明下自己能處理哪些需求
	 */
	public TestEngineer() {
		super(AbstractHandler.TEST_LEVEL_REQUEST);
	}

	@Override
	protected void response(IProject project) {
		System.out.println("項(xiàng)目組向測(cè)試人員咨詢");
		System.out.println(project.getRequest());
		System.out.println("測(cè)試人員的答復(fù)是:找我就對(duì)了");
	}
}

/**
 * @author Evad.Wu
 * @Description 開發(fā)工程師
 * @date 2023-07-10
 */
public class DevelopmentEngineer extends AbstractHandler {
	/**
	 * 每個(gè)責(zé)任節(jié)點(diǎn)都要說(shuō)明下自己能處理哪些需求
	 */
	public DevelopmentEngineer() {
		super(AbstractHandler.DEVELOPER_LEVEL_REQUEST);
	}

	@Override
	protected void response(IProject project) {
		System.out.println("項(xiàng)目組向開發(fā)人員咨詢");
		System.out.println(project.getRequest());
		System.out.println("開發(fā)人員的答復(fù)是:找我就對(duì)了");
	}
}

/**
 * @author Evad.Wu
 * @Description 產(chǎn)品經(jīng)理
 * @date 2023-07-10
 */
public class ProductManager extends AbstractHandler {
	/**
	 * 每個(gè)責(zé)任節(jié)點(diǎn)都要說(shuō)明下自己能處理哪些需求
	 */
	public ProductManager() {
		super(AbstractHandler.PRODUCT_MANAGER_LEVEL_REQUEST);
	}

	@Override
	protected void response(IProject project) {
		System.out.println("項(xiàng)目組向產(chǎn)品經(jīng)理咨詢");
		System.out.println(project.getRequest());
		System.out.println("產(chǎn)品經(jīng)理的答復(fù)是:找我就對(duì)了");
	}
}

項(xiàng)目組抽象、實(shí)現(xiàn)類

public interface IProject {
	/**
	 * 獲取咨詢問題的類型
	 *
	 * @return 類型編號(hào)
	 */
	int getType();

	/**
	 * 獲取咨詢的內(nèi)容
	 *
	 * @return 咨詢的內(nèi)容
	 */
	String getRequest();
}

public class ProjectImpl implements IProject {
	/**
	 * 問題類型
	 * 1-測(cè)試處理 2-開發(fā)處理 3-產(chǎn)品處理
	 */
	private final int type;
	/**
	 * 本次處理的請(qǐng)求
	 */
	private String request;

	public ProjectImpl(int type, String request) {
		this.type = type;
		this.request = request;
		switch (this.type) {
			case 1 -> this.request += "測(cè)試方面的咨詢";
			case 2 -> this.request += "開發(fā)方面的咨詢";
			case 3 -> this.request += "產(chǎn)品方面的咨詢";
			default -> this.request += "沒有人對(duì)應(yīng)的人員可以處理";
		}
	}

	/**
	 * 獲取咨詢問題的類型
	 *
	 * @return 類型編號(hào)
	 */
	public int getType() {
		return type;
	}

	/**
	 * 獲取咨詢的內(nèi)容
	 *
	 * @return 咨詢的內(nèi)容
	 */
	public String getRequest() {
		return request;
	}
}

責(zé)任鏈

負(fù)責(zé)將節(jié)點(diǎn)串聯(lián)起來(lái)

public class Chain<T extends AbstractHandler> {
	// 定義三個(gè)咨詢對(duì)象
	private AbstractHandler peek;

	public Chain(Queue<T> sequence) {
		if (!sequence.isEmpty()) {
			T peek = sequence.peek();
			this.peek = peek;
			sequence.poll();
			for (T current : sequence) {
				peek.setNext(current);
				peek = current;
			}
		}
	}

	public AbstractHandler build() {
		return peek;
	}
}

入口類

public class ResponsibilityChainMain {
	public static void main(String[] args) {
		List<IProject> projectList = new ArrayList<>();
		projectList.add(new ProjectImpl(1, "項(xiàng)目出問題,需要人員支持..."));
		projectList.add(new ProjectImpl(2, "項(xiàng)目出問題,需要人員支持..."));
		projectList.add(new ProjectImpl(3, "項(xiàng)目出問題,需要人員支持..."));
		projectList.add(new ProjectImpl(4, "項(xiàng)目出問題,需要人員支持..."));

		Queue<AbstractHandler> sequence = new LinkedList<>();
		// 咨詢的順序是:測(cè)試、開發(fā)、產(chǎn)品經(jīng)理
		sequence.add(new TestEngineer());
		sequence.add(new DevelopmentEngineer());
		sequence.add(new ProductManager());
		AbstractHandler handler = new Chain<>(sequence).build();
		for (IProject project : projectList) {
			handler.handleMessage(project);
			System.out.println();
		}
	}
}

結(jié)果

設(shè)計(jì)模式——責(zé)任鏈模式,設(shè)計(jì)模式,設(shè)計(jì)模式,責(zé)任鏈模式,java

參考書籍

秦小波《設(shè)計(jì)模式之禪》文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-558015.html

到了這里,關(guān)于設(shè)計(jì)模式——責(zé)任鏈模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【設(shè)計(jì)模式】Java 設(shè)計(jì)模式之責(zé)任鏈模式(Chain of Responsibility)

    責(zé)任鏈模式(Chain of Responsibility) 一、概述 責(zé)任鏈模式是一種行為設(shè)計(jì)模式,它允許請(qǐng)求在對(duì)象鏈中傳遞。每個(gè)對(duì)象都有機(jī)會(huì)處理該請(qǐng)求,并且能將其傳遞給鏈中的下一個(gè)對(duì)象。這種模式為請(qǐng)求創(chuàng)建了一個(gè)處理對(duì)象的鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理它為止

    2024年03月22日
    瀏覽(25)
  • 【玩轉(zhuǎn)23種Java設(shè)計(jì)模式】行為型模式篇:責(zé)任鏈模式

    軟件設(shè)計(jì)模式(Design pattern),又稱設(shè)計(jì)模式,是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性、程序的重用性。 匯總目錄鏈接:【玩轉(zhuǎn)23種Java設(shè)計(jì)模式】學(xué)習(xí)目錄匯總

    2024年02月13日
    瀏覽(18)
  • Java設(shè)計(jì)模式—責(zé)任鏈模式(Chin of Responsibility)

    Java設(shè)計(jì)模式—責(zé)任鏈模式(Chin of Responsibility)

    目錄 前言 一、責(zé)任鏈模式的簡(jiǎn)介 二、責(zé)任鏈模式的概念 三、責(zé)任鏈模式的作用 四、責(zé)任鏈模式的優(yōu)、缺點(diǎn) 1.責(zé)任鏈模式的優(yōu)點(diǎn) 2.責(zé)任鏈模式的缺點(diǎn) 五、責(zé)任鏈模式的應(yīng)用場(chǎng)景 六、代碼案例 UML類圖 ?1.定義一個(gè)請(qǐng)求枚舉類 ?2.定義一個(gè)請(qǐng)求類 3.定義一個(gè)抽象處理接口 4、定

    2024年02月08日
    瀏覽(27)
  • Java設(shè)計(jì)模式-責(zé)任鏈(Chain of Responsibility)模式

    Java設(shè)計(jì)模式-責(zé)任鏈(Chain of Responsibility)模式

    Java責(zé)任鏈(Chain of Responsibility)設(shè)計(jì)模式是指很多處理對(duì)象構(gòu)成一個(gè)鏈,鏈中前一個(gè)對(duì)象指向后一個(gè)對(duì)象。請(qǐng)求在鏈中傳遞,一個(gè)請(qǐng)求可以被一個(gè)或者多個(gè)對(duì)象處理。調(diào)用方(即客戶端)不知道請(qǐng)求會(huì)被鏈中的哪個(gè)對(duì)象處理,所以責(zé)任鏈模式可以方便組織責(zé)任鏈而不影響調(diào)用

    2024年02月16日
    瀏覽(19)
  • Java 大廠八股文面試專題-設(shè)計(jì)模式 工廠方法模式、策略模式、責(zé)任鏈模式

    Java 大廠八股文面試專題-設(shè)計(jì)模式 工廠方法模式、策略模式、責(zé)任鏈模式

    ????????在平時(shí)的開發(fā)中,涉及到設(shè)計(jì)模式的有兩塊內(nèi)容,第一個(gè)是我們 平時(shí)使用的框架 (比如spring、mybatis等),第二個(gè)是我們自己開發(fā)業(yè)務(wù)使用的設(shè)計(jì)模式。 ????????面試官一般比較關(guān)心的是你在開發(fā)過程中, 有沒有使用過設(shè)計(jì)模式,或者你在簡(jiǎn)歷上寫了關(guān)于設(shè)計(jì)

    2024年02月10日
    瀏覽(29)
  • Java設(shè)計(jì)模式之責(zé)任鏈模式(UML類圖分析+代碼詳解)

    Java設(shè)計(jì)模式之責(zé)任鏈模式(UML類圖分析+代碼詳解)

    大家好,我是一名在算法之路上不斷前進(jìn)的小小程序猿!體會(huì)算法之美,領(lǐng)悟算法的智慧~ 希望各位博友走過路過可以給我點(diǎn)個(gè)免費(fèi)的贊,你們的支持是我不斷前進(jìn)的動(dòng)力??! 加油吧!未來(lái)可期??! 本文將介紹java設(shè)計(jì)模式之責(zé)任鏈模式 OA系統(tǒng)采購(gòu)審批需求 傳統(tǒng)方案解決OA系

    2024年02月06日
    瀏覽(16)
  • Java設(shè)計(jì)模式之行為型-責(zé)任鏈模式(UML類圖+案例分析)

    Java設(shè)計(jì)模式之行為型-責(zé)任鏈模式(UML類圖+案例分析)

    目錄 一、基礎(chǔ)概念 二、UML類圖 三、角色設(shè)計(jì) 四、案例分析 4.1、在Java中實(shí)現(xiàn) 4.2、在SpringBoot中實(shí)現(xiàn)? 五、總結(jié)? 責(zé)任鏈模式是一種行為設(shè)計(jì)模式,它允許你將請(qǐng)求沿著處理者鏈進(jìn)行發(fā)送。請(qǐng)求會(huì)被鏈上每個(gè)處理者處理,直到請(qǐng)求被處理完畢。該模式主要解決的是請(qǐng)求的發(fā)送者和

    2024年02月15日
    瀏覽(22)
  • 《設(shè)計(jì)模式》責(zé)任鏈模式

    《設(shè)計(jì)模式》責(zé)任鏈模式

    定義 : 責(zé)任鏈模式將鏈中每一個(gè)節(jié)點(diǎn)都看成一個(gè)對(duì)象,并且將這些節(jié)點(diǎn)對(duì)象連成一條鏈,請(qǐng)求會(huì)沿著這條鏈進(jìn)行傳遞,直到有對(duì)象處理它為止,這使得多個(gè)對(duì)象都有機(jī)會(huì)接收請(qǐng)求,避免了請(qǐng)求發(fā)送者和接收者之間的耦合。 屬于 行為型 設(shè)計(jì)模式。 責(zé)任鏈模式的角色組成 :

    2024年02月13日
    瀏覽(17)
  • 設(shè)計(jì)模式:責(zé)任鏈模式

    責(zé)任鏈模式(Chain of Responsibility Pattern)是一種行為型設(shè)計(jì)模式,它允許多個(gè)對(duì)象按照順序處理請(qǐng)求,直到其中一個(gè)對(duì)象能夠處理該請(qǐng)求為止。責(zé)任鏈模式將請(qǐng)求發(fā)送者和接收者解耦,使得多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,同時(shí)避免了請(qǐng)求發(fā)送者與接收者之間的直接耦合關(guān)系。 在

    2024年02月07日
    瀏覽(21)
  • 【設(shè)計(jì)模式】責(zé)任鏈模式

    【設(shè)計(jì)模式】責(zé)任鏈模式

    顧名思義,責(zé)任鏈模式(Chain of Responsibility Pattern)為請(qǐng)求創(chuàng)建了一個(gè)接收者對(duì)象的鏈。這種模式給予請(qǐng)求的類型,對(duì)請(qǐng)求的發(fā)送者和接收者進(jìn)行解耦。這種類型的設(shè)計(jì)模式屬于行為型模式。 在這種模式中,通常每個(gè)接收者都包含對(duì)另一個(gè)接收者的引用。如果一個(gè)對(duì)象不能處

    2024年02月12日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包