設(shè)計模式---中介者模式(DesignPattern_Mediator)

摘錄自:設(shè)計模式與游戲完美開發(fā)

十年磨一劍,作者將設(shè)計模式理論巧妙地融入到實踐中,以一個游戲的完整實現(xiàn)呈現(xiàn)設(shè)計模式的應(yīng)用及經(jīng)驗的傳承 《軒轅劍》之父——蔡明宏、資深游戲制作人——李佳澤、Product Evangelist at Unity Technologies——Kelvin Lo、信仁軟件設(shè)計創(chuàng)辦人—— 賴信仁、資深3D游戲美術(shù)——劉明愷 聯(lián)合推薦全書采用了整合式的項目教學,即以一個游戲的范例來應(yīng)用23種設(shè)計模式的實現(xiàn)貫穿全書,讓讀者學習到整個游戲開發(fā)的全過程和作者想要傳承的經(jīng)驗,并以淺顯易懂的比喻來解析難以理解的設(shè)計模式,讓想深入了解此領(lǐng)域的讀者更加容易上手。


工程GitHub

MEDIATOR—四個MM打麻將,相互之間誰應(yīng)該給誰多少錢算不清楚了,幸虧當時我在旁邊,按照各自的籌碼數(shù)算錢,賺了錢的從我這里拿,賠了錢的也付給我,一切就OK啦,俺得到了四個MM的電話。

  • 中介者模式:調(diào)停者模式包裝了一系列對象相互作用的方式,使得這些對象不必相互明顯作用。從而使他們可以松散偶合。當某些對象之間的作用發(fā)生改變時,不會立即影響其他的一些對象之間的作用。保證這些作用可以彼此獨立的變化。調(diào)停者模式將多對多的相互作用轉(zhuǎn)化為一對多的相互作用。調(diào)停者模式將對象的行為和協(xié)作抽象化,把對象在小尺度的行為上與其他對象的相互作用分開處理。

源碼注釋及命名有所更改,個人感覺會比原版更好理解

using UnityEngine;
using System.Collections;

namespace DesignPattern_Mediator
{
    // 中介者抽象類
    public abstract class Mediator
    {
        public abstract void SendMessage(People theColleague,string Message);
    }

    // Mediator所關(guān)聯(lián)的People
    public abstract class People
    {
        protected Mediator m_Mediator = null;
        public People( Mediator theMediator)
        {
            m_Mediator = theMediator;
        }

        // 經(jīng)過Mediator收到的請求
        public abstract void Request(string Message);

    }

    // 實例People的類1
    public class ConcreatePeople1 : People
    {
        public ConcreatePeople1( Mediator theMediator) : base(theMediator)
        {}

        // 執(zhí)行通知操作
        public void Action()
        {
            // 通過Mediator向其他人傳遞信息
            m_Mediator.SendMessage(this, "ConcreatePeople1發(fā)出的信息");
        }

        // 經(jīng)過Mediator收到的請求
        public override void Request(string Message)
        {
            Debug.Log("ConcreateColleague1收到:" + Message);
        }
    }

    // 實例People的類2
    public class ConcreatePeople2 : People
    {
        public ConcreatePeople2( Mediator theMediator) : base(theMediator)
        {}

        // 執(zhí)行通知操作
        public void Action()
        {
            // 通過Mediator向其他人傳遞信息
            m_Mediator.SendMessage(this, "ConcreatePeople2發(fā)出的信息");
        }

        // Mediator通知請求
        public override void Request(string Message)
        {
            Debug.Log("ConcreateColleague2收到:"+Message);
        }
    }   

    // 實作Mediator界面,並集合管理People物件
    public class ConcreteMediator : Mediator
    {
        ConcreatePeople1 m_People1 = null;
        ConcreatePeople2 m_People2 = null;

        public void SetColleageu1(ConcreatePeople1 thePeople )
        {
            m_People1 = thePeople;
        }

        public void SetColleageu2(ConcreatePeople2 thePeople)
        {
            m_People2 = thePeople;
        }

        // 收到由People通知請求
        public override void SendMessage(People thePeople, string Message)
        {
            // 收到Colleague1通知Colleague2
            if(m_People1 == thePeople)
                m_People2.Request( Message);

            // 收到Colleague2通知Colleague1
            if(m_People2 == thePeople)
                m_People1.Request( Message);
        }
    }
}
using UnityEngine;
using System.Collections;
using DesignPattern_Mediator;

public class MediatorTest : MonoBehaviour
{


    void Start()
    {
        UnitTest();
    }

    void UnitTest()
    {
        // 實例中介者
        ConcreteMediator pMediator = new ConcreteMediator();

        // 產(chǎn)產(chǎn)生2個People實例
        ConcreatePeople1 People1 = new ConcreatePeople1(pMediator);
        ConcreatePeople2 People2 = new ConcreatePeople2(pMediator);

        // 設(shè)置對應(yīng)的中介者
        pMediator.SetColleageu1(People1);
        pMediator.SetColleageu2(People2);

        // 執(zhí)行通知相關(guān)操作
        People1.Action();
        People2.Action();
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 好的軟件設(shè)計是多用代碼復(fù)用,但實際設(shè)計中卻要遇到許多變化,而變化是復(fù)用的天敵。為了能夠盡量減少變化所帶來的設(shè)計復(fù)雜...
    CharlesW閱讀 638評論 0 0
  • 轉(zhuǎn)載自:經(jīng)典:從追MM談Java的23種設(shè)計模式 佩服原文作者對設(shè)計模式的深刻理解,哈哈哈?? 一. 創(chuàng)建型模式 1...
    濤大閱讀 988評論 0 2
  • 創(chuàng)建型模式 1、FACTORY—追MM少不了請吃飯了,麥當勞的雞翅和肯德基的雞翅都是MM愛吃的東西,雖然口味有所不...
    珈誼閱讀 383評論 0 0
  • 又一次在半夜驚醒不知道是因為夢還是因為心 發(fā)了一條狀態(tài)媽媽立馬就回復(fù)很多年后她又可以獨自在家沒有了露露沒有了樂樂好...
    樹妮兒閱讀 331評論 0 0
  • 之前太陽的后裔火的不行不行的時候,我聽了妹妹的話等它養(yǎng)肥后再看,昨天今天惡補了一下,全部都看完了。因為最近也在追小...
    麥基閱讀 331評論 1 0

友情鏈接更多精彩內(nèi)容