1. 程式人生 > >設計模式系列20---聊聊IoC與中介者

設計模式系列20---聊聊IoC與中介者

有一個叫控制反轉(Inversion of Control,縮寫IoC ) 的東西 ,這個對於計算機的人應該是不陌生的概念,就算你不知道那個Bob大叔

這個概念簡單說的是下面這樣的事情

enter image description here

原本各個類之間的關係亂七八糟的,看起來頭都暈了。
他們就像齒輪一樣,相互咬合依賴。

enter image description here
如果有一個出問題,那可能整個就崩潰了。

但是,如果有一個人出來承擔大事,負責協調各個類的話!
那麼,他們的關係就可以是像下面圖片這樣的,
各個物件之間可以不感受到對方的“存在”,但整體又運作良好。
enter image description here

舉個可能不恰當的例子:

企業ObjectA要招人,可能要去學校ObjectB開宣講會,去別的企業ObjectC

挖人等等。
有些人看到了其中的機會,專門負責為企業輸送人才,我們稱這類人叫獵頭Ioc(也有人才中心等,這裡為描述方便,不細究),他負責幫助企業去找到需要的人,我們的HR就可以在公司呆著,看著獵頭源源不斷髮來簡歷就好了!
再也不用去和學校,別的企業打交道了。是的,從此HR與這兩者解耦合,過上了幸福美好的生活!!

那麼問題來了,如何用中介者模式來模擬這個招聘流程?

今天我們要聊的這個就中介者就是類似的情況,我們來看下實際的程式碼情況。

程式碼實現

現在來看下我們的公司吧

public class Company extends AbstractColleague {

    public Company(AbstractMediator abstractMediator) {
        super(abstractMediator);
    }

    public void seeResume(String resume) {
        System.out.println("正在看簡歷: " + resume);
    }

    public void startToHunt() {
        abstractMediator.execute(AbstractMediator.Action.START_HIRE);
    }
}

我們的公司主要工作就是看簡歷,發通知說我要開始招人了,為了方便說明,就把後續的面試環節剩了。

另外,我們要求實現AbstractColleague,用於對外溝通的地方,是我們的齒輪與IOC發生聯絡的基礎。

public abstract class AbstractColleague {

    AbstractMediator abstractMediator;

    public AbstractColleague(AbstractMediator abstractMediator) {
        this.abstractMediator = abstractMediator;
    }
}

然後我們的學生也類似

public class Student extends AbstractColleague {

    public Student(AbstractMediator abstractMediator) {
        super(abstractMediator);
    }

    public String getMyResume() {
        return "我的簡歷很簡單";
    }

    public void findJob() {
        abstractMediator.execute(AbstractMediator.Action.FIND_JOB_SCHOOL, getMyResume());
    }
}

找工作主要通過校招的途徑。

而對於這類的已經在上班的人啊,主要就是社招來跳槽了。

public class Employee extends AbstractColleague {

    public Employee(AbstractMediator abstractMediator) {
        super(abstractMediator);
    }

    public String getMyResume() {
        return "這是我的簡歷,專案經驗很多";
    }

    public void findJob() {
        abstractMediator.execute(AbstractMediator.Action.FIND_JOB_SOCAIL, getMyResume());
    }

    public void refuseOffer() {
        System.out.println("這公司我不去");
    }

}

好了,準備好這麼多,得來看下我們的獵頭

public abstract class AbstractMediator {

    protected Company mCompany;
    protected Student mStudent;
    protected Employee mEmployee;

    public AbstractMediator() {

        mCompany = new Company(this);
        mStudent = new Student(this);
        mEmployee = new Employee(this);
    }

    public abstract void execute(Action action, Object... objects);

    public enum Action {
        FIND_JOB_SCHOOL, FIND_JOB_SOCAIL,START_HIRE
    }

}

我們抽象出獵頭和學生,公司打交道,所以有這麼幾個內部變數,另外他的基本行為就是幫人找工作,執行特定的行為execute(),但具體怎麼做,就見仁見智了。

例如下面這位,他對好簡歷的要求是最少有10個字。少於十個字的都不幫你交出去,免得丟了自己的招牌。

public class HeadMediator extends AbstractMediator {

    private int GOOD_RESUME = 10;   
    private boolean isCompanyStartToHire = false;

    @Override
    public void execute(Action action, Object... objects) {
        switch (action) {
            case FIND_JOB_SCHOOL:
                findJobBySchool((String) objects[0]);
                break;
            case FIND_JOB_SOCAIL:
                findJobBySocial((String) objects[0]);
                break;
            case START_HIRE:
                isCompanyStartToHire = true;
                break;
        }
    }

    public void findJobBySocial(String resume) {
        if (isCompanyStartToHire && resume.length() > GOOD_RESUME) {
            super.mCompany.seeResume(resume);
        }
    }

    public void findJobBySchool(String resume) {
        if (isCompanyStartToHire && resume.length() > GOOD_RESUME) {
            super.mCompany.seeResume(resume);
        }
    }
}

基本我們準備好了,來看下我們的測試案例

public class Client {

    public static void main(String[] args) {

        AbstractMediator mediator=new HeadMediator();

        Company company=new Company(mediator);
        company.startToHunt();//公司說開始招人人    

        Student student=new Student(mediator);
        student.findJob();//學生開始找工作

        Employee employee=new Employee(mediator);
        employee.findJob();//員工想跳槽,開始找工作    
    }
}

類圖

enter image description here

後記

這個中介者模式到目前位置,在我的開發羨慕中是沒有實際的自己手動寫過。
不過倒是用過不少類似的庫,例如我們的EventBus,OTTO,廣播等。

通過這個中介者模式,具體的活到底是怎樣的流程,我們全部進行了抽象,交給了中介者,各個類需要做的就是專注於自己本身的行為。當然,這樣的高度控制集中化也是有點小小問題的,當涉及到的類多起來,通訊複雜的時候,這個類要寫的內容還是不少的,這可能使他難以維護!

參考資料

相關推薦

設計模式系列20---聊聊IoC中介

有一個叫控制反轉(Inversion of Control,縮寫IoC ) 的東西 ,這個對於計算機的人應該是不陌生的概念,就算你不知道那個Bob大叔。 這個概念簡單說的是下面這樣的事情 原本各個類之間的關係亂七八糟的,看起來頭都暈了。 他們就像齒輪一

Java 設計模式系列(十六)觀察模式(Observer)

for out 其中 如果 observer 業務 ets 同時 hang Java 設計模式系列(十六)觀察者模式(Observer) 觀察者模式是對象的行為模式,又叫發布-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式、源-監聽

一個故事貫穿設計模式(二十一)中介模式

   這裡記錄的是中介者模式。  在解耦上面具有重要的意義。 包結構: 類結構: 測試入口: package com.automannn.design_mode.mediator.test; import com.automannn.design

設計模式(二十一)中介模式

中介者模式(Mediator):用一箇中介物件來封裝一系列的物件互動。中介者使各物件不需要顯示地相互引用,從未使其耦合鬆散,而且可以獨立地改變他們之間的互動 類圖的來源: public abstract class Mediator { public

C++設計模式(二十一)—中介模式

中介者模式 用一箇中介物件來封裝一系列的物件互動。中介者使個各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動。 本文講解中介者模式框架,程式碼使用C++語言描述,程式碼存在的不足或問題有望各位指出。 中介者模式程式碼框

Android設計模式系列(2)--SDK原始碼之觀察模式

觀察者模式,是一種非常常見的設計模式,在很多系統中隨處可見,尤其是涉及到資料狀態發生變化需要通知的情況下。本文以AbstractCursor為例子,展開分析。觀察者模式,Observer Pattern,是一個很實用的模式,本人曾經接觸到的各種平臺以及曾經參與專案中列印模板直譯器中都用到了此模式。 1.意圖

設計模式:物件去耦(中介,觀察

為了嚴格遵循MVC,MVVM等架構模式,經常需要物件去耦。 10、中介者模式:用一個物件來封裝一系列物件的互動方式。中介者使各物件不需要顯示地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的

設計模式系列 - 中介模式

中介者模式是用來降低多個物件和類之間的通訊複雜性。這種模式提供了一箇中介類,該類通常處理不同類之間的通訊,並支援鬆耦合,使程式碼易於維護。 前言 中介者模式屬於行為者模式,通過一箇中介物件來封裝一些列的物件互動,使物件之間解耦和,降低系統複雜度。 類圖描述 程式碼實現 1、建立中介類

設計模式系列中介模式

引入 1.案例: 假設計算機1,2,3,4之間要相互通訊。 2.面向實現程式設計方案: 類Computer1中要儲存類Computer2、類Computer3和類Computer4例項,才能呼叫Computer2、Computer3、Comput

設計模式系列之建造模式(Builder Pattern)——複雜物件的組裝建立

說明:設計模式系列文章是讀`劉偉`所著`《設計模式的藝術之道(軟體開發人員內功修煉之道)》`一書的閱讀筆記。個人感覺這本書講的不錯,有興趣推薦讀一讀。詳細內容也可以看看此書作者的部落格`https://blog.csdn.net/LoveLion/article/details/17517213` ## 模

設計模式系列中介模式(Mediator Pattern)——協調多個物件之間的互動

說明:設計模式系列文章是讀`劉偉`所著`《設計模式的藝術之道(軟體開發人員內功修煉之道)》`一書的閱讀筆記。個人感覺這本書講的不錯,有興趣推薦讀一讀。詳細內容也可以看看此書作者的部落格`https://blog.csdn.net/LoveLion/article/details/17517213` ## 模

設計模式系列---簡單工廠、工廠方法、抽象工廠

nds top exc .cn 原則 而在 類圖 opp sop 前言,最近看spring的源代碼。發現之前沒有完全弄懂(工廠方法、抽象工廠)的區別。 spring中代理對象的產生,是通過代理工廠(工廠模式),首先spring中的代理是使用jdk或者cglib的代理,只要看

設計模式系列---適配器模式

private 字節碼 攔截 代理 bsp 攔截器 xtend 我們 客戶 寫在前面   適配模式的定義如下:   將一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配兒無法在一起工作的兩個類能夠在一起工作。 看下適配器模式的類圖: spring中的適

[js高手之路]設計模式系列課程-單例模式實現模態框

ges 點擊 eat abs select nbsp str osi 控制 什麽是單例呢? 單,就是一個的意思。例:就是實例化出來的對象,那合在一起就是保證一個構造函數只能new出一個實例,為什麽要學習單例模式呢?或者說單例模式有哪些常見的應用場景.它的使用還是很廣泛,比如

[js高手之路]設計模式系列課程-委托模式實戰微博發布功能

i++ 發布 動態 use shee 內容 標題 cnblogs 文件 在實際開發中,經常需要為Dom元素綁定事件,如果頁面上有4個li元素,點擊對應的li,彈出對應的li內容,怎麽做呢?是不是很簡單? 大多數人的做法都是:獲取元素,綁定事件 1 <ul&

[js高手之路]設計模式系列課程-發布,訂閱重構購物車

購物車 代碼重構 發布者訂閱者模式,是一種很常見的模式,比如:一、買賣房子生活中的買房,賣房,中介就構成了一個發布訂閱者模式,買房的人,一般需要的是房源,價格,使用面積等信息,他充當了訂閱者的角色中介拿到賣主的房源信息,根據手頭上掌握的客戶聯系信息(買房的人的手機號),通知買房的人,他充當了發布者的角

java設計模式系列設計模式概要(1)

而不是 行為型模式 一句話 創建 rom 多次 ati 代理模式 之間 一、什麽是設計模式   設計模式(Design pattern)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。

(原創)我眼中的設計模式系列之簡單工廠模式(一)

int 業務 text 們的 acc 現在 rgs sub reat 簡單工廠模式   在日常的軟件開發中,我們一般都是按照模塊來劃分工作的。 場景一:   試想我們現在有這麽一個模塊,為其他的模塊提供服務,比如說我們調用了好幾個外部接口,統一返回XML字符串,每個接口返回

Java 設計模式系列(五)單例模式

重要 理解 iat 版本 ide 默認 ces 內部實現 成功 Java 設計模式系列(五)單例模式 單例模式確保某個類只有一個實例,而且自行實例化並向整個系統提供這個實例。 一、懶漢式單例 /** * 懶漢式單例類.在第一次調用的時候實例化自己 * 1. 構造器私

Java 設計模式系列(六)適配器模式

建議 技術 amp (六) image 必須 一起 nts 工作 Java 設計模式系列(六)適配器模式 適配器模式把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。 適配器模式的結構: 類的適配器模式 對象的