13屋厘、仲裁者模式(Mediator Pattern)

1. 仲裁者模式

1.1 簡介

??仲裁者模式又稱為調(diào)停者模式或中介者模式薯鳍,主要是仲裁和中介的作用咖气,幫助其它類之間進行通信,降低多個對象和類之間的通信復(fù)雜性挖滤。主要包括仲裁者(Mediator)和組員(Colleague)崩溪,組員的動作需要會向仲裁者匯報,仲裁者會根據(jù)全局的實際情況向其他Colleague作出指示斩松,共同完成一定的邏輯功能伶唯。仲裁者通常處理不同類之間的通信,并支持松耦合惧盹,使代碼易于維護乳幸。作為行為型的模式之一,應(yīng)用場景有限并不被大家熟知钧椰。

1.2 仲裁者結(jié)構(gòu)

仲裁者uml:

仲裁者uml.jpg

仲裁者成員:

  • 抽象仲裁者(mediator):定義一個接口用于和對象通信(SmartDevice)
  • 具體仲裁者(concretemediator):協(xié)調(diào)各同事對象實現(xiàn)協(xié)作粹断,了解維護各個同事()
  • 抽象同事角色(colleague):規(guī)定了同事的基本類型
  • 具體同事角色(concreteColleague):每個同事都知道仲裁者對象,要與同事通信則把通信告訴仲裁者

2. 示例

??我們以房屋出租為例演侯,房東通過中介將房子租給租客姿染,直接從中介處拿到租金,租客通過中介找到房東進行維修,同時物業(yè)通過中介向房東收取物業(yè)費悬赏。在此例中狡汉,中介相當(dāng)于仲裁者或者中介者,房東闽颇、租客和物業(yè)就是組員盾戴,組員之間通過中介進行通信,實現(xiàn)收租兵多、維修尖啡、收物業(yè)費等動作。

仲裁者接口類:

public interface Mediator {

    void collectRents(int money);
    void repair();
    void collectPropertyFee(int money);
}

房屋中介:

public class HouseMediator implements Mediator {

    private Person houseRenter;
    private Person renter;
    private Person property;

    public HouseMediator(Person houseRenter, Person renter,
        Person property) {
        this.houseRenter = houseRenter;
        this.renter = renter;
        this.property = property;
    }

    @Override
    public void collectRents(int money) {

    }

    public void repair() {

    }

    @Override
    public void collectPropertyFee(int money) {

    }

    public Person getHouseRenter() {
        return houseRenter;
    }

    public void setHouseRenter(Person houseRenter) {
        this.houseRenter = houseRenter;
    }

    public Person getRenter() {
        return renter;
    }

    public void setRenter(Person renter) {
        this.renter = renter;
    }

    public Person getProperty() {
        return property;
    }

    public void setProperty(Person property) {
        this.property = property;
    }
}

組員虛擬類:

public abstract class Person {

    private Mediator houseMediator;

    public abstract void action();

    public Mediator getHouseMediator() {
        return houseMediator;
    }

    public void setHouseMediator(Mediator houseMediator) {
        this.houseMediator = houseMediator;
    }
}

房東:

public class HouseOwner extends Person {

    @Override
    public void action() {
        this.getHouseMediator().collectRents(1000);
    }
}

租客:

public class Renter extends Person {

    @Override
    public void action() {
        this.getHouseMediator().repair();
    }
}

物業(yè):

public class Property extends Person {

    @Override
    public void action() {
        this.getHouseMediator().collectPropertyFee(300);
    }
}

客戶端調(diào)用:

    public static void main(String[] args) {

        Person houseRenter = new HouseOwner();
        Person renter = new Renter();
        Person property = new Property();

        Mediator mediator = new HouseMediator(houseRenter, renter, property);
        houseRenter.setHouseMediator(mediator);
        renter.setHouseMediator(mediator);
        property.setHouseMediator(mediator);

        houseRenter.action();
        renter.action();
        property.action();
    }

3. 總結(jié)

仲裁者模式的優(yōu)點:

  • 降低了類的復(fù)雜度剩膘,將一對多轉(zhuǎn)化成了一對一衅斩。
  • 各個類之間的解耦,減少對象之間的關(guān)聯(lián)性怠褐,讓每一個對象都能夠獨立
  • 符合迪米特原則畏梆。
  • 不會引入太多其他的系統(tǒng)
  • 系統(tǒng)被依賴的程度降低

仲裁者模式的缺點:

  • 中介者會龐大,變得復(fù)雜難以維護奈懒。
  • 如果游戲中有大量的功能模塊需要中介者奠涌,那么擔(dān)任中介者的角色類將會因為擔(dān)任大量的中介者角色而容易產(chǎn)生操作接口爆炸的情況。為避免這種情況磷杏,我們可以搭配其他設(shè)計模式使用溜畅。

仲裁者模式的使用場景:

  • 系統(tǒng)中對象之間存在比較復(fù)雜的引用關(guān)系,導(dǎo)致它們之間的依賴關(guān)系結(jié)構(gòu)混亂而且難以復(fù)用該對象极祸。
  • 想通過一個中間類來封裝多個類中的行為慈格,而又不想生成太多的子類。
  • 機場調(diào)度系統(tǒng)贿肩。
  • MVC 框架峦椰,其中C(控制器)就是 M(模型)和 V(視圖)的中介者龄寞。
  • 數(shù)據(jù)庫引擎:內(nèi)部可以分成數(shù)個子系統(tǒng),有專門負(fù)責(zé)數(shù)據(jù)庫連接地功能與產(chǎn)生數(shù)據(jù)庫操作語句地功能,兩個子功能之間地溝通可以通過中介者模式(Mediator)來進行,讓兩者之間不相互依賴,方便抽換另一個子系統(tǒng)
  • 游戲內(nèi)各系統(tǒng)的整合
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汰规,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子物邑,更是在濱河造成了極大的恐慌溜哮,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件色解,死亡現(xiàn)場離奇詭異茂嗓,居然都是意外死亡,警方通過查閱死者的電腦和手機科阎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門述吸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事蝌矛〉琅” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵入撒,是天一觀的道長隆豹。 經(jīng)常有香客問我,道長茅逮,這世上最難降的妖魔是什么璃赡? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮献雅,結(jié)果婚禮上碉考,老公的妹妹穿的比我還像新娘。我一直安慰自己挺身,他們只是感情好豆励,可當(dāng)我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瞒渠,像睡著了一般良蒸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上伍玖,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天嫩痰,我揣著相機與錄音,去河邊找鬼窍箍。 笑死串纺,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的椰棘。 我是一名探鬼主播纺棺,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼邪狞!你這毒婦竟也來了祷蝌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤帆卓,失蹤者是張志新(化名)和其女友劉穎巨朦,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剑令,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡糊啡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吁津。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棚蓄。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出梭依,到底是詐尸還是另有隱情挣柬,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布睛挚,位于F島的核電站邪蛔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏扎狱。R本人自食惡果不足惜侧到,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淤击。 院中可真熱鬧匠抗,春花似錦、人聲如沸污抬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽印机。三九已至矢腻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間射赛,已是汗流浹背多柑。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留楣责,地道東北人竣灌。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像秆麸,于是被迫代替她去往敵國和親初嘹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,500評論 2 359