行為型模式:責任鏈模式

来源:https://www.cnblogs.com/liebrother/archive/2019/02/25/10429187.html
-Advertisement-
Play Games

LieBrother原文 : "行為型模式:責任鏈模式" 十一大行為型模式之四:責任鏈模式。 簡介 姓名 :責任鏈模式 英文名 :Chain of Responsibility Pattern 價值觀 :責任歸我 個人介紹 : Avoid coupling the sender of a reque ...


LieBrother原文
行為型模式:責任鏈模式

景色

十一大行為型模式之四:責任鏈模式。

簡介

姓名 :責任鏈模式

英文名 :Chain of Responsibility Pattern

價值觀 :責任歸我

個人介紹
Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.
使多個對象都有機會處理請求,從而避免了請求的發送者和接受者之間的耦合關係。將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有對象處理它為止。
(來自《設計模式之禪》)

你要的故事

快要金三銀四了,很多同學蠢蠢欲動想要去外面看看世界,而大家有沒有提前瞭解各大企業的面試流程呢?這裡我就給大家科普一下大多數互聯網企業的面試流程,正好責任鏈模式用得上。

在互聯網企業中,程式員這個崗位的招聘流程大同小異,而一般至少都會有 3 輪面試,分別是 2 輪技術面和 1 輪 HR 面。而這幾輪面試都是層層遞進的,最開始面試一般是組長面試,通過之後就是部門領導面試,再通過之後就是 HR 面試,HR 面試通過之後就可以成功拿到 Offer 了。

故事從小明參加某公司的面試開始,某公司的招聘流程就是上面說的 3 輪面試。招聘流程的面試官分別是:第一面是組長老剛,第二面是部門經理老孫,第三面也就是終面是 HR 老劉。為什麼說這個場景符合責任鏈模式呢?首先不管是組長還是部門經理還是 HR,他們都作為面試官,面試官賦予他們的權利是去面試來公司面試的同學,而面試的結果是可傳遞性的,也就是如果面試通過,就會到下一輪面試,最終成為一條傳遞鏈。我們用代碼模擬這個過程。

public class ChainOfResponsibilityTest {

    public static void main(String[] args) {
        Interviewee interviewee = new Interviewee("小明");
        TeamLeader teamLeader = new TeamLeader("老剛");
        DepartMentManager departMentManager = new DepartMentManager("老孫");
        HR hr = new HR("老劉");
        // 設置面試流程
        teamLeader.setNextInterviewer(departMentManager);
        departMentManager.setNextInterviewer(hr);
        // 開始面試
        teamLeader.handleInterview(interviewee);
    }

}

/**
 * 面試者
 */
class Interviewee {

    private String name;

    private boolean teamLeaderOpinion;
    private boolean departMentManagerOpinion;
    private boolean hrOpinion;

    public Interviewee(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isTeamLeaderOpinion() {
        return teamLeaderOpinion;
    }

    public void setTeamLeaderOpinion(boolean teamLeaderOpinion) {
        this.teamLeaderOpinion = teamLeaderOpinion;
    }

    public boolean isDepartMentManagerOpinion() {
        return departMentManagerOpinion;
    }

    public void setDepartMentManagerOpinion(boolean departMentManagerOpinion) {
        this.departMentManagerOpinion = departMentManagerOpinion;
    }

    public boolean isHrOpinion() {
        return hrOpinion;
    }

    public void setHrOpinion(boolean hrOpinion) {
        this.hrOpinion = hrOpinion;
    }
}

/**
 * 面試官
 */
abstract class Interviewer {

    protected String name;
    protected Interviewer nextInterviewer;

    public Interviewer(String name) {
        this.name = name;
    }

    public Interviewer setNextInterviewer(Interviewer nextInterviewer) {
        this.nextInterviewer = nextInterviewer;
        return this.nextInterviewer;
    }

    public abstract void handleInterview(Interviewee interviewee);

}

/**
 * 組長
 */
class TeamLeader extends Interviewer {

    public TeamLeader(String name) {
        super(name);
    }

    @Override
    public void handleInterview(Interviewee interviewee) {
        System.out.println("組長[" + this.name + "]面試[" + interviewee.getName() + "]同學");
        interviewee.setTeamLeaderOpinion(new Random().nextBoolean());
        if (interviewee.isTeamLeaderOpinion()) {
            System.out.println("[" + interviewee.getName() + "]同學組長輪面試通過");
            this.nextInterviewer.handleInterview(interviewee);
        } else {
            System.out.println("[" + interviewee.getName() + "]同學組長輪面試不通過");
        }
    }
}

/**
 * 部門經理
 */
class DepartMentManager extends Interviewer {

    public DepartMentManager(String name) {
        super(name);
    }

    @Override
    public void handleInterview(Interviewee interviewee) {
        System.out.println("部門經理[" + this.name + "]面試[" + interviewee.getName() + "]同學");
        interviewee.setDepartMentManagerOpinion(new Random().nextBoolean());
        if (interviewee.isDepartMentManagerOpinion()) {
            System.out.println("[" + interviewee.getName() + "]同學部門經理輪面試通過");
            this.nextInterviewer.handleInterview(interviewee);
        } else {
            System.out.println("[" + interviewee.getName() + "]同學部門經理輪面試不通過");
        }
    }
}

/**
 * HR
 */
class HR extends Interviewer {

    public HR(String name) {
        super(name);
    }

    @Override
    public void handleInterview(Interviewee interviewee) {
        System.out.println("HR[" + this.name + "]面試[" + interviewee.getName() + "]同學");
        interviewee.setHrOpinion(new Random().nextBoolean());
        if (interviewee.isHrOpinion()) {
            System.out.println("[" + interviewee.getName() + "]同學HR輪面試通過, 恭喜拿到 Offer");
        } else {
            System.out.println("[" + interviewee.getName() + "]同學HR輪面試不通過");
        }
    }
}

列印結果:
組長[老剛]面試[小明]同學
[小明]同學組長輪面試通過
部門經理[老孫]面試[小明]同學
[小明]同學部門經理輪面試通過
HR[老劉]面試[小明]同學
[小明]同學HR輪面試通過, 恭喜拿到 Offer

上面代碼列印結果是小明通過層層篩選,通過了面試,拿到了 Offer。下麵的圖來展現這次面試的流程。

流程圖

講解一下代碼,Interviewee 是面試者,對於企業來說這個面試者來面試的過程會有 3 個關鍵標識,就是 3 位面試官對這位面試者的評價,只有都評價好才能通過面試拿到 Offer,所以 Interviewee 類有 3 位面試官的面試結果。Interviewer 是面時官,企業中面試官不是一個職位,而是一個工作,幫企業招到合適的人才,所以它是一個抽象類,有一個抽象方法就是去面試應聘者,具體面試過程又各面試官實現,而因為這個面試會有結果反饋,結果好的會進入下一輪面試,所以會有下一個面試官的對象引用,責任鏈模式也就在這裡體現。TeamLeader、DepartMentManager、HR 則為公司的不同職位,而這些職位當公司需要招聘時,都需要去充當面試官,所以都繼承了 Interviewer。這整個過程就構成了責任鏈模式代碼示例,希望在金三銀四各位蠢蠢欲動的朋友們都能闖到最後一關拿下 HR 姐姐。

代碼:
Chain of Responsibility Pattern

總結

責任鏈模式很好的把處理的邏輯封裝起來,在代碼中,我們看到的只是組長面試,但是其實背後隱藏著部門經理和HR的面試。責任鏈是不是看起來很熟悉?在開發 Java Web 項目的時候是不是有用到過?Filter 過濾器裡面就是用責任鏈模式來實現的。上面代碼還用到了另一個模式,不明確指出來了,考驗大家學習這些設計模式的效果,知道的同學可以留言說一下。

參考資料:《大話設計模式》、《設計模式之禪》

推薦閱讀:

公眾號之設計模式系列文章

希望文章對您有所幫助,設計模式系列會持續更新,感興趣的同學可以關註公眾號:LieBrother,第一時間獲取文章推送閱讀,也可以一起交流,交個朋友。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 錯誤消息如圖: 如果你看到此錯誤消息,則說明 v-for 指令的 key值 重覆了,只需修改你的 key值 讓其不會重覆即可。 ...
  • Reverse a String 翻轉字元串 先把字元串轉化成數組,再藉助數組的reverse方法翻轉數組順序,最後把數組轉化成字元串。 你的結果必須得是一個字元串 當你完成不了挑戰的時候,記得開大招'Read-Search-Ask'。 這是一些對你有幫助的資源: Global String Obj ...
  • 效果展示: 源碼:https://github.com/ProsperLee/demo-h5-package ...
  • 背景:easyui在做上下佈局的時候,上面是數據列表,下麵是數據圖表。如下圖 需要在上下麵板右上角加上最大化按鈕,以便可以全屏顯示。邏輯就是當上面點擊最大化時候,隱藏下麵,主意:此時需要將下麵的div標題設置為空字元,否則後果就是列表中間有一道人員能力統計圖標題;當點擊恢復按鈕的時候,展示下麵圖表, ...
  • LieBrother原文 : "行為型模式:策略模式" 十一大行為型模式之五:策略模式。 簡介 姓名 :策略模式 英文名 :Strategy Pattern 價值觀 :集計謀於一身 個人介紹 : Define a family of algorithms,encapsulate each one,a ...
  • 一、前言 什麼是命令模式? 在軟體系統中,“行為請求者”與“行為實現者”通常呈現一種“緊耦合”。但在某些場合,比如要對行為進行“記錄、撤銷/重做、事務”等處理,這種無法抵禦變化的緊耦合是不合適的。在這種情況下,如何將“行為請求者”與“行為實現者”解耦?將一組行為抽象為對象,實現二者之間的松耦合,這就 ...
  • 1.代碼生成器: [正反雙向](單表、主表、明細表、樹形表,快速開發利器)+快速表單構建器freemaker模版技術 ,0個代碼不用寫,生成完整的一個模塊,帶頁面、建表sql腳本、處理類、service等完整模塊2.多數據源:(支持同時連接無數個資料庫,可以不同的模塊連接不同數的據庫)支持N個數據源 ...
  • 一、什麼是OCTO 定義: OCTO是美團的分散式服務通信框架及服務治理系統,屬於公司級基礎設施,目前尚未開源。 目標: 為公司所有業務提供統一的服務通信框架,使業務具備良好的服務運營能力,輕鬆實現服務註冊、服務自動發現、負載均衡、容錯、灰度發佈、調用數據可視化等,持續提升服務高可用性、服務運維效率 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...