设计模式示例_责任链设计模式示例
設計模式示例
本文是我們名為“ Java設計模式 ”的學院課程的一部分。
在本課程中,您將深入研究大量的設計模式,并了解如何在Java中實現和利用它們。 您將了解模式如此重要的原因,并了解何時以及如何應用模式中的每一個。 在這里查看 !
目錄
1.責任鏈模式 2.什么是責任鏈模式 3.落實責任鏈 4.何時使用責任鏈模式 5. JDK中的責任鏈 6.下載源代碼1.責任鏈模式
責任鏈模式是一種行為模式,其中一組對象按順序鏈接在一起,并提供一個責任(請求)以便由該組進行處理。 如果組中的對象可以處理特定請求,則可以處理該特定請求并返回相應的響應。 否則,它將請求轉發到組中的后續對象。
對于現實生活中的場景,為了理解這種模式,假設您有一個要解決的問題。 如果您能夠自己處理,則可以這樣做,否則您將告訴您的朋友解決該問題。 如果他能夠解決,那么他會做到,或者也將其轉發給其他朋友。 該問題將被轉發,直到您的一個朋友解決了該問題,或者您的所有朋友都看到了問題,但是沒有人能夠解決它,在這種情況下問題仍然沒有解決。
讓我們解決現實生活中的情況。 您的公司已獲得一份合同,向一家衛生公司提供分析應用程序。 該應用程序將告訴用戶特定的健康問題,其病史,治療,藥物,對患有該疾病的人的采訪等,以及了解該疾病所需的一切。 為此,您的公司會收到大量數據。 數據可以是任何格式,可以是文本文件,doc文件,excel,音頻,圖像,視頻,以及任何您能想到的東西。
現在,您的工作就是將這些數據保存在公司的數據庫中。 用戶將以任何格式提供數據,并且您應該為他們提供一個界面,以將數據上傳到數據庫中。 用戶對知道如何保存不同的非結構化數據不感興趣,甚至不知道。
這里的問題是您需要開發不同的處理程序來保存各種格式的數據。 例如,文本文件保存處理程序不知道如何保存mp3文件。
要解決此問題,您可以使用“責任鏈”設計模式。 您可以創建不同的對象,以處理不同的數據格式并將它們鏈接在一起。 當請求到單個對象時,它將檢查它是否可以處理和處理特定的文件格式。 如果可以,它將進行處理。 否則,它將轉發到鏈接到它的下一個對象。 這種設計模式還使用戶與正在處理請求的對象脫鉤。 用戶不知道哪個對象實際上正在為其請求提供服務。
在解決問題之前,首先讓我們進一步了解責任鏈設計模式。
2.什么是責任鏈模式
這種模式的目的是通過給多個對象一個處理請求的機會,避免將請求的發送者耦合到其接收者。 我們將接收的對象鏈接起來,并沿著鏈接傳遞請求,直到有一個對象處理它為止。
這種模式是關于在通知鏈中連接對象的。 當通知沿鏈傳送時,它由設置為處理特定通知的第一個對象處理。
當有多個對象可以處理或滿足客戶請求時,該模式建議為這些對象中的每一個提供按順序處理請求的機會。 在這種情況下應用模式,這些潛在處理程序中的每一個都可以以鏈的形式排列,每個對象都引用鏈中的下一個對象。 鏈中的第一個對象接收請求,并決定處理該請求或將其傳遞給鏈中的下一個對象。 該請求一個接一個地流經鏈中的所有對象,直到該請求由鏈中的一個處理程序處理,或者該請求到達鏈的末尾而不被處理。
圖1
處理程序
混凝土處理機
客戶
當客戶端發出請求時,請求將沿著鏈傳播,直到ConcreteHandler對象負責處理該請求。
3.落實責任鏈
為了實現責任鏈以解決上述問題,我們將創建一個接口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用于設置鏈中的下一個處理程序。 僅當處理程序能夠處理請求時,才使用process方法處理請求。 (可選)我們具有getHandlerName方法,該方法用于返回處理程序的名稱。
處理程序旨在處理包含數據的文件。 具體處理程序通過檢查文件類型來檢查是否能夠處理文件,否則轉發到鏈中的下一個處理程序。
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類創建簡單的文件對象,其中包含文件名,文件類型和文件路徑。 處理程序將使用文件類型來檢查文件是否可以被處理程序處理。 如果有處理程序,它將處理并保存它,或者將其轉發到鏈中的下一個處理程序。
現在讓我們來看一些具體的處理程序。
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用于處理文本文件。 它實現Handler接口并覆蓋其三個方法。 它擁有對鏈中下一個處理程序的引用。 在process方法中,它檢查文件類型是否為文本,對其進行處理或將其轉發給下一個處理程序。
其他處理程序與上述處理程序類似。
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;} }現在,讓我們測試上面的代碼。
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);}}上面的程序將具有以下輸出。
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在上面的示例中,首先我們創建了不同的處理程序并將它們鏈接在一起。 該鏈從用于處理文本文件的文本處理程序開始,到文檔處理程序等等,直到最后一個處理程序即圖像處理程序。
然后,我們創建了不同的文件對象,并將其傳遞給文本處理程序。 如果文本處理程序可以處理該文件,則執行該操作,否則將文件轉發到下一個鏈接的處理程序。 您可以在輸出中看到鏈接對象如何轉發請求的文件,直到到達適當的處理程序為止。
另外,請注意,我們尚未創建處理程序來處理bat文件。 因此,它通過所有處理程序并產生輸出–“不支持文件”。
客戶端代碼與提供的對象分離。 它僅發送請求,并且該請求由鏈中的任何處理程序提供服務,或者在有支持的情況下不進行處理。
4.何時使用責任鏈模式
在以下情況下使用責任鏈
5. JDK中的責任鏈
以下是Java中的責任鏈模式的用法。
6.下載源代碼
這是“責任鏈模式”的一課。 您可以在此處下載源代碼: ChainofResponsibility-Project
翻譯自: https://www.javacodegeeks.com/2015/09/chain-of-responsibility-design-pattern-2.html
設計模式示例
總結
以上是生活随笔為你收集整理的设计模式示例_责任链设计模式示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 甘肃天水旅游景点大全(天水最值得去的九大
- 下一篇: java jooq_将Java EE与j