欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java通俗易懂系列設(shè)計(jì)模式之責(zé)任鏈模式

 更新時(shí)間:2021年04月23日 09:57:47   作者:JaJian  
這篇文章主要介紹了Java通俗易懂系列設(shè)計(jì)模式之責(zé)任鏈模式,對(duì)設(shè)計(jì)模式感興趣的同學(xué),一定要看一下

概述

責(zé)任鏈設(shè)計(jì)模式是行為設(shè)計(jì)模式之一。

責(zé)任鏈模式用于在軟件設(shè)計(jì)中實(shí)現(xiàn)松散耦合,其中來(lái)自客戶(hù)端的請(qǐng)求被傳遞到對(duì)象鏈以處理它們。然后鏈中的對(duì)象將自己決定誰(shuí)將處理請(qǐng)求以及是否需要將請(qǐng)求發(fā)送到鏈中的下一個(gè)對(duì)象。

JDK中的責(zé)任鏈模式示例

讓我們看一下JDK中責(zé)任鏈模式的例子,然后我們將繼續(xù)實(shí)現(xiàn)這種模式的真實(shí)例子。我們知道在try-catch塊代碼中我們可以有多個(gè)catch塊。這里每個(gè)catch塊都是處理該特定異常的處理器。

因此當(dāng)try塊中發(fā)生任何異常時(shí),它會(huì)發(fā)送到第一個(gè)catch塊進(jìn)行處理。如果catch塊無(wú)法處理它,它會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到鏈中的下一個(gè)對(duì)象,即下一個(gè)catch塊。如果即使最后一個(gè)catch塊也無(wú)法處理它,那么異常將被拋出鏈接到調(diào)用程序。

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

責(zé)任鏈模式的一個(gè)很好的例子是ATM分配機(jī)器。用戶(hù)按照定義的貨幣賬單輸入要分配的金額和機(jī)器分配金額,例如50美元,20美元,10美元等。
如果用戶(hù)輸入的數(shù)量不是10的倍數(shù),則會(huì)引發(fā)錯(cuò)誤。我們將使用Chain of Responsibility模式來(lái)實(shí)現(xiàn)此解決方案。鏈將以與下圖相同的順序處理請(qǐng)求。

請(qǐng)注意,我們可以在單應(yīng)用程序中輕松實(shí)現(xiàn)此解決方案,但隨后復(fù)雜性將增加,解決方案將緊密耦合。因此,我們將創(chuàng)建一系列分配系統(tǒng),以分配50美元,20美元和10美元的賬單。

責(zé)任鏈設(shè)計(jì)模式 - 基類(lèi)和接口

我們可以創(chuàng)建一個(gè)類(lèi)Currency來(lái)存儲(chǔ)分配和鏈實(shí)現(xiàn)使用的數(shù)量。

Currency.java

package com.journaldev.design.chainofresponsibility;

public class Currency {

	private int amount;
	
	public Currency(int amt){
		this.amount=amt;
	}
	
	public int getAmount(){
		return this.amount;
	}
}

基接口應(yīng)該有一個(gè)方法來(lái)定義鏈中的下一個(gè)處理器以及處理請(qǐng)求的方法。我們的ATM Dispense界面如下所示。

DispenseChain.java

package com.journaldev.design.chainofresponsibility;

public interface DispenseChain {

	void setNextChain(DispenseChain nextChain);
	
	void dispense(Currency cur);
}

責(zé)任鏈模式 - 鏈實(shí)現(xiàn)

我們需要?jiǎng)?chuàng)建不同的處理器類(lèi)來(lái)實(shí)現(xiàn)DispenseChain接口并提供分配方法的實(shí)現(xiàn)。由于我們正在開(kāi)發(fā)我們的系統(tǒng)以使用三種類(lèi)型的貨幣賬單--50美元,20美元和10美元,我們將創(chuàng)建三個(gè)具體實(shí)施。
Dollar50Dispenser.java

package com.journaldev.design.chainofresponsibility;

public class Dollar50Dispenser implements DispenseChain {

	private DispenseChain chain;
	
	@Override
	public void setNextChain(DispenseChain nextChain) {
		this.chain=nextChain;
	}

	@Override
	public void dispense(Currency cur) {
		if(cur.getAmount() >= 50){
			int num = cur.getAmount()/50;
			int remainder = cur.getAmount() % 50;
			System.out.println("Dispensing "+num+" 50$ note");
			if(remainder !=0) this.chain.dispense(new Currency(remainder));
		}else{
			this.chain.dispense(cur);
		}
	}

}

Dollar20Dispenser.java

package com.journaldev.design.chainofresponsibility;

public class Dollar20Dispenser implements DispenseChain{

	private DispenseChain chain;
	
	@Override
	public void setNextChain(DispenseChain nextChain) {
		this.chain=nextChain;
	}

	@Override
	public void dispense(Currency cur) {
		if(cur.getAmount() >= 20){
			int num = cur.getAmount()/20;
			int remainder = cur.getAmount() % 20;
			System.out.println("Dispensing "+num+" 20$ note");
			if(remainder !=0) this.chain.dispense(new Currency(remainder));
		}else{
			this.chain.dispense(cur);
		}
	}

}

Dollar10Dispenser.java

package com.journaldev.design.chainofresponsibility;

public class Dollar10Dispenser implements DispenseChain {

	private DispenseChain chain;
	
	@Override
	public void setNextChain(DispenseChain nextChain) {
		this.chain=nextChain;
	}

	@Override
	public void dispense(Currency cur) {
		if(cur.getAmount() >= 10){
			int num = cur.getAmount()/10;
			int remainder = cur.getAmount() % 10;
			System.out.println("Dispensing "+num+" 10$ note");
			if(remainder !=0) this.chain.dispense(new Currency(remainder));
		}else{
			this.chain.dispense(cur);
		}
	}

}

這里要注意的重點(diǎn)是分配方法的實(shí)施。您會(huì)注意到每個(gè)實(shí)現(xiàn)都在嘗試處理請(qǐng)求,并且根據(jù)數(shù)量,它可能會(huì)處理部分或全部部分。
如果其中一個(gè)鏈不能完全處理它,它會(huì)將請(qǐng)求發(fā)送到鏈中的下一個(gè)處理器以處理剩余的請(qǐng)求。如果處理器無(wú)法處理任何內(nèi)容,它只會(huì)將相同的請(qǐng)求轉(zhuǎn)發(fā)到下一個(gè)鏈。

責(zé)任鏈設(shè)計(jì)模式 - 創(chuàng)建鏈

這是非常重要的一步,我們應(yīng)該仔細(xì)創(chuàng)建鏈,否則處理器可能根本沒(méi)有得到任何請(qǐng)求。例如,在我們的實(shí)現(xiàn)中,如果我們將第一個(gè)處理器鏈保持為Dollar10Dispenser然后Dollar20Dispenser,那么請(qǐng)求將永遠(yuǎn)不會(huì)被轉(zhuǎn)發(fā)到第二個(gè)處理器,并且鏈將變得無(wú)用。

這是我們的ATM Dispenser實(shí)現(xiàn),用于處理用戶(hù)請(qǐng)求的數(shù)量。

ATMDispenseChain.java

package com.journaldev.design.chainofresponsibility;

import java.util.Scanner;

public class ATMDispenseChain {

	private DispenseChain c1;

	public ATMDispenseChain() {
		// initialize the chain
		this.c1 = new Dollar50Dispenser();
		DispenseChain c2 = new Dollar20Dispenser();
		DispenseChain c3 = new Dollar10Dispenser();

		// set the chain of responsibility
		c1.setNextChain(c2);
		c2.setNextChain(c3);
	}

	public static void main(String[] args) {
		ATMDispenseChain atmDispenser = new ATMDispenseChain();
		while (true) {
			int amount = 0;
			System.out.println("Enter amount to dispense");
			Scanner input = new Scanner(System.in);
			amount = input.nextInt();
			if (amount % 10 != 0) {
				System.out.println("Amount should be in multiple of 10s.");
				return;
			}
			// process the request
			atmDispenser.c1.dispense(new Currency(amount));
		}

	}

}

當(dāng)我們運(yùn)行上面的應(yīng)用程序時(shí),我們得到如下的輸出。

Enter amount to dispense

530

Dispensing 10 50$ note

Dispensing 1 20$ note

Dispensing 1 10$ note

Enter amount to dispense

100

Dispensing 2 50$ note

Enter amount to dispense

120

Dispensing 2 50$ note

Dispensing 1 20$ note

Enter amount to dispense

15

責(zé)任鏈設(shè)計(jì)模式類(lèi)圖

我們的ATM分配示例的責(zé)任鏈設(shè)計(jì)模式實(shí)現(xiàn)如下圖所示。

責(zé)任鏈設(shè)計(jì)模式重點(diǎn)

  • 客戶(hù)端不知道鏈的哪個(gè)部分將處理請(qǐng)求,它將把請(qǐng)求發(fā)送到鏈中的第一個(gè)對(duì)象。例如,在我們的程序中,ATMDispenseChain不知道誰(shuí)在處理分配輸入金額的請(qǐng)求。
  • 鏈中的每個(gè)對(duì)象都有自己的實(shí)現(xiàn)來(lái)處理請(qǐng)求,全部或部分或?qū)⑵浒l(fā)送到鏈中的下一個(gè)對(duì)象。
  • 鏈中的每個(gè)對(duì)象都應(yīng)該引用鏈中的下一個(gè)對(duì)象來(lái)轉(zhuǎn)發(fā)請(qǐng)求,它由java組成。
  • 仔細(xì)創(chuàng)建鏈非常重要,否則可能會(huì)出現(xiàn)請(qǐng)求永遠(yuǎn)不會(huì)轉(zhuǎn)發(fā)到特定處理器或鏈中沒(méi)有能夠處理請(qǐng)求的對(duì)象的情況。在我的實(shí)現(xiàn)中,我添加了對(duì)用戶(hù)輸入數(shù)量的檢查,以確保它被所有處理器完全處理,但是如果請(qǐng)求到達(dá)最后一個(gè)對(duì)象并且鏈中沒(méi)有其他對(duì)象,我們可能不檢查它并拋出異常將請(qǐng)求轉(zhuǎn)發(fā)給。這是一個(gè)設(shè)計(jì)決定。
  • 責(zé)任鏈設(shè)計(jì)模式很好地實(shí)現(xiàn)了失去耦合,但如果大多數(shù)代碼在所有實(shí)現(xiàn)中都很常見(jiàn),那么它會(huì)帶來(lái)很多實(shí)現(xiàn)類(lèi)和維護(hù)問(wèn)題的權(quán)衡。

JDK中的責(zé)任鏈模式示例

  • java.util.logging.Logger#log()
  • javax.servlet.Filter#doFilter()

以上就是Java通俗易懂系列設(shè)計(jì)模式之責(zé)任鏈模式的詳細(xì)內(nèi)容,更多關(guān)于Java設(shè)計(jì)模式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java 執(zhí)行CMD命令或執(zhí)行BAT批處理方式

    Java 執(zhí)行CMD命令或執(zhí)行BAT批處理方式

    這篇文章主要介紹了Java 執(zhí)行CMD命令或執(zhí)行BAT批處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • mybatis?傳入null值的解決方案

    mybatis?傳入null值的解決方案

    這篇文章主要介紹了mybatis?傳入null值的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringSecurity?Web權(quán)限方案實(shí)現(xiàn)全過(guò)程

    SpringSecurity?Web權(quán)限方案實(shí)現(xiàn)全過(guò)程

    Spring Security是一個(gè)功能強(qiáng)大且高度可定制的身份驗(yàn)證和授權(quán)框架,專(zhuān)門(mén)用于保護(hù)Java應(yīng)用程序的Web集成,下面這篇文章主要給大家介紹了關(guān)于SpringSecurity?Web權(quán)限方案實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Spring Boot Web 靜態(tài)文件緩存處理的方法

    Spring Boot Web 靜態(tài)文件緩存處理的方法

    本篇文章主要介紹了Spring Boot Web 靜態(tài)文件緩存處理的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • idea配置全局變量Jdk、maven倉(cāng)庫(kù)以及maven詳解(全文圖解)

    idea配置全局變量Jdk、maven倉(cāng)庫(kù)以及maven詳解(全文圖解)

    這篇文章主要給大家介紹了關(guān)于idea配置全局變量Jdk、maven倉(cāng)庫(kù)以及maven的相關(guān)資料,在配置JDK和Maven之前,需要確保已經(jīng)正確安裝了JDK和Maven,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • spring事務(wù)@Transactional失效原因及解決辦法小結(jié)

    spring事務(wù)@Transactional失效原因及解決辦法小結(jié)

    今天就跟大家聊聊有關(guān)spring中@Transactional失效原因及解決辦法小結(jié),主要從三個(gè)方面考慮,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • 如何利用MyBatisX插件自動(dòng)生成代碼

    如何利用MyBatisX插件自動(dòng)生成代碼

    這篇文章主要介紹了如何利用MyBatisX插件自動(dòng)生成代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • MyBatis-Plus 分頁(yè)查詢(xún)以及自定義sql分頁(yè)的實(shí)現(xiàn)

    MyBatis-Plus 分頁(yè)查詢(xún)以及自定義sql分頁(yè)的實(shí)現(xiàn)

    這篇文章主要介紹了MyBatis-Plus 分頁(yè)查詢(xún)以及自定義sql分頁(yè)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Java web項(xiàng)目啟動(dòng)Tomcat報(bào)錯(cuò)解決方案

    Java web項(xiàng)目啟動(dòng)Tomcat報(bào)錯(cuò)解決方案

    這篇文章主要介紹了Java web項(xiàng)目啟動(dòng)Tomcat報(bào)錯(cuò)解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • java能寫(xiě)爬蟲(chóng)程序嗎

    java能寫(xiě)爬蟲(chóng)程序嗎

    在本篇文章里小編給大家整理的是一篇關(guān)于java是否能寫(xiě)爬蟲(chóng)程序的一篇文章,對(duì)此有興趣的朋友們可以學(xué)習(xí)下。
    2021-01-01

最新評(píng)論