日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式示例_责任链设计模式示例

發(fā)布時間:2023/12/3 asp.net 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式示例_责任链设计模式示例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

設(shè)計模式示例

本文是我們名為“ Java設(shè)計模式 ”的學(xué)院課程的一部分。

在本課程中,您將深入研究大量的設(shè)計模式,并了解如何在Java中實現(xiàn)和利用它們。 您將了解模式如此重要的原因,并了解何時以及如何應(yīng)用模式中的每一個。 在這里查看 !

目錄

1.責(zé)任鏈模式 2.什么是責(zé)任鏈模式 3.落實責(zé)任鏈 4.何時使用責(zé)任鏈模式 5. JDK中的責(zé)任鏈 6.下載源代碼

1.責(zé)任鏈模式

責(zé)任鏈模式是一種行為模式,其中一組對象按順序鏈接在一起,并提供一個責(zé)任(請求)以便由該組進(jìn)行處理。 如果組中的對象可以處理特定請求,則可以處理該特定請求并返回相應(yīng)的響應(yīng)。 否則,它將請求轉(zhuǎn)發(fā)到組中的后續(xù)對象。

對于現(xiàn)實生活中的場景,為了理解這種模式,假設(shè)您有一個要解決的問題。 如果您能夠自己處理,則可以這樣做,否則您將告訴您的朋友解決該問題。 如果他能夠解決,那么他會做到,或者也將其轉(zhuǎn)發(fā)給其他朋友。 該問題將被轉(zhuǎn)發(fā),直到您的一個朋友解決了該問題,或者您的所有朋友都看到了問題,但是沒有人能夠解決它,在這種情況下問題仍然沒有解決。

讓我們解決現(xiàn)實生活中的情況。 您的公司已獲得一份合同,向一家衛(wèi)生公司提供分析應(yīng)用程序。 該應(yīng)用程序?qū)⒏嬖V用戶特定的健康問題,其病史,治療,藥物,對患有該疾病的人的采訪等,以及了解該疾病所需的一切。 為此,您的公司會收到大量數(shù)據(jù)。 數(shù)據(jù)可以是任何格式,可以是文本文件,doc文件,excel,音頻,圖像,視頻,以及任何您能想到的東西。

現(xiàn)在,您的工作就是將這些數(shù)據(jù)保存在公司的數(shù)據(jù)庫中。 用戶將以任何格式提供數(shù)據(jù),并且您應(yīng)該為他們提供一個界面,以將數(shù)據(jù)上傳到數(shù)據(jù)庫中。 用戶對知道如何保存不同的非結(jié)構(gòu)化數(shù)據(jù)不感興趣,甚至不知道。

這里的問題是您需要開發(fā)不同的處理程序來保存各種格式的數(shù)據(jù)。 例如,文本文件保存處理程序不知道如何保存mp3文件。

要解決此問題,您可以使用“責(zé)任鏈”設(shè)計模式。 您可以創(chuàng)建不同的對象,以處理不同的數(shù)據(jù)格式并將它們鏈接在一起。 當(dāng)請求到單個對象時,它將檢查它是否可以處理和處理特定的文件格式。 如果可以,它將進(jìn)行處理。 否則,它將轉(zhuǎn)發(fā)到鏈接到它的下一個對象。 這種設(shè)計模式還使用戶與正在處理請求的對象脫鉤。 用戶不知道哪個對象實際上正在為其請求提供服務(wù)。

在解決問題之前,首先讓我們進(jìn)一步了解責(zé)任鏈設(shè)計模式。

2.什么是責(zé)任鏈模式

這種模式的目的是通過給多個對象一個處理請求的機(jī)會,避免將請求的發(fā)送者耦合到其接收者。 我們將接收的對象鏈接起來,并沿著鏈接傳遞請求,直到有一個對象處理它為止。

這種模式是關(guān)于在通知鏈中連接對象的。 當(dāng)通知沿鏈傳送時,它由設(shè)置為處理特定通知的第一個對象處理。

當(dāng)有多個對象可以處理或滿足客戶請求時,該模式建議為這些對象中的每一個提供按順序處理請求的機(jī)會。 在這種情況下應(yīng)用模式,這些潛在處理程序中的每一個都可以以鏈的形式排列,每個對象都引用鏈中的下一個對象。 鏈中的第一個對象接收請求,并決定處理該請求或?qū)⑵鋫鬟f給鏈中的下一個對象。 該請求一個接一個地流經(jīng)鏈中的所有對象,直到該請求由鏈中的一個處理程序處理,或者該請求到達(dá)鏈的末尾而不被處理。

圖1

處理程序

  • 定義用于處理請求的接口。
  • (可選)實現(xiàn)后繼鏈接。
  • 混凝土處理機(jī)

  • 處理要求它負(fù)責(zé)的請求。
  • 可以訪問其后繼者。
  • 如果ConcreteHandler可以處理請求,則可以處理; 否則,它將請求轉(zhuǎn)發(fā)給其后繼者。
  • 客戶

  • 向鏈上的ConcreteHandler對象發(fā)起請求。
  • 當(dāng)客戶端發(fā)出請求時,請求將沿著鏈傳播,直到ConcreteHandler對象負(fù)責(zé)處理該請求。

    3.落實責(zé)任鏈

    為了實現(xiàn)責(zé)任鏈以解決上述問題,我們將創(chuàng)建一個接口Handler。

    package com.javacodegeeks.patterns.chainofresponsibility;public interface Handler {public void setHandler(Handler handler);public void process(File file);public String getHandlerName(); }

    上面的接口包含兩個主要方法, setHandler和process方法。 setHandler用于設(shè)置鏈中的下一個處理程序。 僅當(dāng)處理程序能夠處理請求時,才使用process方法處理請求。 (可選)我們具有g(shù)etHandlerName方法,該方法用于返回處理程序的名稱。

    處理程序旨在處理包含數(shù)據(jù)的文件。 具體處理程序通過檢查文件類型來檢查是否能夠處理文件,否則轉(zhuǎn)發(fā)到鏈中的下一個處理程序。

    File類如下所示。

    package com.javacodegeeks.patterns.chainofresponsibility;public class File {private final String fileName;private final String fileType;private final String filePath;public File(String fileName, String fileType, String filePath){this.fileName = fileName;this.fileType = fileType;this.filePath = filePath;}public String getFileName() {return fileName;}public String getFileType() {return fileType;}public String getFilePath() {return filePath;}}

    File類創(chuàng)建簡單的文件對象,其中包含文件名,文件類型和文件路徑。 處理程序?qū)⑹褂梦募愋蛠頇z查文件是否可以被處理程序處理。 如果有處理程序,它將處理并保存它,或者將其轉(zhuǎn)發(fā)到鏈中的下一個處理程序。

    現(xiàn)在讓我們來看一些具體的處理程序。

    package com.javacodegeeks.patterns.chainofresponsibility;public class TextFileHandler implements Handler {private Handler handler;private String handlerName;public TextFileHandler(String handlerName){this.handlerName = handlerName;}@Overridepublic void setHandler(Handler handler) {this.handler = handler;}@Overridepublic void process(File file) {if(file.getFileType().equals("text")){System.out.println("Process and saving text file... by "+handlerName);}else if(handler!=null){System.out.println(handlerName+" fowards request to "+handler.getHandlerName());handler.process(file);}else{System.out.println("File not supported");}}@Overridepublic String getHandlerName() {return handlerName;} }

    TextFileHandler用于處理文本文件。 它實現(xiàn)Handler接口并覆蓋其三個方法。 它擁有對鏈中下一個處理程序的引用。 在process方法中,它檢查文件類型是否為文本,對其進(jìn)行處理或?qū)⑵滢D(zhuǎn)發(fā)給下一個處理程序。

    其他處理程序與上述處理程序類似。

    package com.javacodegeeks.patterns.chainofresponsibility;public class DocFileHandler implements Handler{private Handler handler;private String handlerName;public DocFileHandler(String handlerName){this.handlerName = handlerName;}@Overridepublic void setHandler(Handler handler) {this.handler = handler;}@Overridepublic void process(File file) {if(file.getFileType().equals("doc")){System.out.println("Process and saving doc file... by "+handlerName);}else if(handler!=null){System.out.println(handlerName+" fowards request to "+handler.getHandlerName());handler.process(file);}else{System.out.println("File not supported");}}@Overridepublic String getHandlerName() {return handlerName;}}package com.javacodegeeks.patterns.chainofresponsibility;public class AudioFileHandler implements Handler {private Handler handler;private String handlerName;public AudioFileHandler(String handlerName){this.handlerName = handlerName;}@Overridepublic void setHandler(Handler handler) {this.handler = handler;}@Overridepublic void process(File file) {if(file.getFileType().equals("audio")){System.out.println("Process and saving audio file... by "+handlerName);}else if(handler!=null){System.out.println(handlerName+" fowards request to "+handler.getHandlerName());handler.process(file);}else{System.out.println("File not supported");}}@Overridepublic String getHandlerName() {return handlerName;}}package com.javacodegeeks.patterns.chainofresponsibility;public class ExcelFileHandler implements Handler{private Handler handler;private String handlerName;public ExcelFileHandler(String handlerName){this.handlerName = handlerName;}@Overridepublic void setHandler(Handler handler) {this.handler = handler;}@Overridepublic void process(File file) {if(file.getFileType().equals("excel")){System.out.println("Process and saving excel file... by "+handlerName);}else if(handler!=null){System.out.println(handlerName+" fowards request to "+handler.getHandlerName());handler.process(file);}else{System.out.println("File not supported");}}@Overridepublic String getHandlerName() {return handlerName;} }package com.javacodegeeks.patterns.chainofresponsibility;public class ImageFileHandler implements Handler {private Handler handler;private String handlerName;public ImageFileHandler(String handlerName){this.handlerName = handlerName;}@Overridepublic void setHandler(Handler handler) {this.handler = handler;}@Overridepublic void process(File file) {if(file.getFileType().equals("image")){System.out.println("Process and saving image file... by "+handlerName);}else if(handler!=null){System.out.println(handlerName+" fowards request to "+handler.getHandlerName());handler.process(file);}else{System.out.println("File not supported");}}@Overridepublic String getHandlerName() {return handlerName;}}package com.javacodegeeks.patterns.chainofresponsibility;public class VideoFileHandler implements Handler {private Handler handler;private String handlerName;public VideoFileHandler(String handlerName){this.handlerName = handlerName;}@Overridepublic void setHandler(Handler handler) {this.handler = handler;}@Overridepublic void process(File file) {if(file.getFileType().equals("video")){System.out.println("Process and saving video file... by "+handlerName);}else if(handler!=null){System.out.println(handlerName+" fowards request to "+handler.getHandlerName());handler.process(file);}else{System.out.println("File not supported");}}@Overridepublic String getHandlerName() {return handlerName;} }

    現(xiàn)在,讓我們測試上面的代碼。

    package com.javacodegeeks.patterns.chainofresponsibility;public class TestChainofResponsibility {public static void main(String[] args) {File file = null;Handler textHandler = new TextFileHandler("Text Handler");Handler docHandler = new DocFileHandler("Doc Handler");Handler excelHandler = new ExcelFileHandler("Excel Handler");Handler audioHandler = new AudioFileHandler("Audio Handler");Handler videoHandler = new VideoFileHandler("Video Handler");Handler imageHandler = new ImageFileHandler("Image Handler");textHandler.setHandler(docHandler);docHandler.setHandler(excelHandler);excelHandler.setHandler(audioHandler);audioHandler.setHandler(videoHandler);videoHandler.setHandler(imageHandler);file = new File("Abc.mp3", "audio", "C:");textHandler.process(file);System.out.println("---------------------------------");file = new File("Abc.jpg", "video", "C:");textHandler.process(file);System.out.println("---------------------------------");file = new File("Abc.doc", "doc", "C:");textHandler.process(file);System.out.println("---------------------------------");file = new File("Abc.bat", "bat", "C:");textHandler.process(file);}}

    上面的程序?qū)⒕哂幸韵螺敵觥?

    Text Handler fowards request to Doc Handler Doc Handler fowards request to Excel Handler Excel Handler fowards request to Audio Handler Process and saving audio file... by Audio Handler --------------------------------- Text Handler fowards request to Doc Handler Doc Handler fowards request to Excel Handler Excel Handler fowards request to Audio Handler Audio Handler fowards request to Video Handler Process and saving video file... by Video Handler --------------------------------- Text Handler fowards request to Doc Handler Process and saving doc file... by Doc Handler --------------------------------- Text Handler fowards request to Doc Handler Doc Handler fowards request to Excel Handler Excel Handler fowards request to Audio Handler Audio Handler fowards request to Video Handler Video Handler fowards request to Image Handler File not supported

    在上面的示例中,首先我們創(chuàng)建了不同的處理程序并將它們鏈接在一起。 該鏈從用于處理文本文件的文本處理程序開始,到文檔處理程序等等,直到最后一個處理程序即圖像處理程序。

    然后,我們創(chuàng)建了不同的文件對象,并將其傳遞給文本處理程序。 如果文本處理程序可以處理該文件,則執(zhí)行該操作,否則將文件轉(zhuǎn)發(fā)到下一個鏈接的處理程序。 您可以在輸出中看到鏈接對象如何轉(zhuǎn)發(fā)請求的文件,直到到達(dá)適當(dāng)?shù)奶幚沓绦驗橹埂?

    另外,請注意,我們尚未創(chuàng)建處理程序來處理bat文件。 因此,它通過所有處理程序并產(chǎn)生輸出–“不支持文件”。

    客戶端代碼與提供的對象分離。 它僅發(fā)送請求,并且該請求由鏈中的任何處理程序提供服務(wù),或者在有支持的情況下不進(jìn)行處理。

    4.何時使用責(zé)任鏈模式

    在以下情況下使用責(zé)任鏈

  • 一個以上的對象可以處理一個請求,并且處理程序不是先驗的。 處理程序應(yīng)自動確定。
  • 您要向多個對象之一發(fā)出請求,而無需顯式指定接收者。
  • 可以動態(tài)指定可以處理請求的對象集。
  • 5. JDK中的責(zé)任鏈

    以下是Java中的責(zé)任鏈模式的用法。

  • java.util.logging.Logger#log()
  • javax.servlet.Filter#doFilter()
  • 6.下載源代碼

    這是“責(zé)任鏈模式”的一課。 您可以在此處下載源代碼: ChainofResponsibility-Project

    翻譯自: https://www.javacodegeeks.com/2015/09/chain-of-responsibility-design-pattern-2.html

    設(shè)計模式示例

    總結(jié)

    以上是生活随笔為你收集整理的设计模式示例_责任链设计模式示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。