国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

設計模式(20)---中介者模式

2019-11-14 16:17:39
字體:
來源:轉載
供稿:網友

一、定義

中介者模式:用一個中介對象來封裝一系列的對象交互。中介者使對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。

解釋:通俗來講,有多個對象,它們相互之間有交互。現在為了降低它們的耦合度,提供一個中介者,相當于第三方,各個對象都通過第三方來進行相互間的邏輯操作。

 

二、UML類圖及基本代碼

基本代碼:

abstract class Mediator    {        public abstract void Send(string message, Colleague colleague);    }    class ConcreteMediator : Mediator    {        PRivate ConcreteColleage1 colleague1;        private ConcreteColleage2 colleague2;        public ConcreteColleage1 Colleague1        {            set { colleague1 = value; }        }        public ConcreteColleage2 Colleague2        {            set { colleague2 = value; }        }        public override void Send(string message, Colleague colleague)        {            if (colleague == colleague1)            {                colleague2.Receive(message);            }            else            {                colleague1.Receive(message);            }        }    }    abstract class Colleague    {        protected Mediator mediator;        public Colleague(Mediator mediator)        {            this.mediator = mediator;        }    }    class ConcreteColleage1 : Colleague    {        public ConcreteColleage1(Mediator mediator)            : base(mediator)        { }        public void Send(string message)        {            mediator.Send(message, this);        }        public void Receive(string message)        {            Console.WriteLine("同事1得到信息:" + message);        }    }    class ConcreteColleage2 : Colleague    {        public ConcreteColleage2(Mediator mediator)            : base(mediator)        { }        public void Send(string message)        {            mediator.Send(message, this);        }        public void Receive(string message)        {            Console.WriteLine("同事2得到信息:" + message);        }    }

 

客戶端調用及其結果:

ConcreteMediator mediator = new ConcreteMediator();            ConcreteColleage1 c1 = new ConcreteColleage1(mediator);            ConcreteColleage2 c2 = new ConcreteColleage2(mediator);            mediator.Colleague1 = c1;            mediator.Colleague2 = c2;            c1.Send("吃飯了嗎?");            c2.Send("還沒有,你打算請客?");

 

三、具體實例

A和B博弈,A贏則B會輸,反之亦然。假設A和B開始時都要20塊錢,基本代碼如下:

首先構造抽象中介者類和具體中介者類:

public abstract class AbstractMediator    {        public abstract void AWin(int count);        public abstract void BWin(int count);    }    public class MediatorPater : AbstractMediator    {        private ParterA a;        private ParterB b;        public ParterA A        {            set { a = value; }        }        public ParterB B        {            set { b = value; }        }        public override void AWin(int count)        {            a.MoneyCount += count;            b.MoneyCount -= count;        }        public override void BWin(int count)        {            b.MoneyCount += count;            a.MoneyCount -= count;        }    }

接著編寫抽象對弈者,構造具體的對弈者A和B:

public abstract class AbstractCardPartner    {        public int MoneyCount { get; set; }        public AbstractCardPartner()        {            MoneyCount = 0;        }        public abstract void ChangeCount(int count, AbstractMediator mediator);    }    public class ParterA : AbstractCardPartner    {        public override void ChangeCount(int Count, AbstractMediator mediator)        {            mediator.AWin(Count);        }    }    public class ParterB : AbstractCardPartner    {        public override void ChangeCount(int Count, AbstractMediator mediator)        {            mediator.BWin(Count);        }    }

客戶端調用代碼及其結果:

MediatorPater mediator = new MediatorPater();            ParterA partA = new ParterA();            ParterB partB = new ParterB();            mediator.A = partA;            mediator.B = partB;            partA.MoneyCount = 20;            partB.MoneyCount = 20;            partA.ChangeCount(7, mediator);            Console.WriteLine("A 現在的錢是:{0}", partA.MoneyCount);            Console.WriteLine("B 現在的錢是:{0}", partB.MoneyCount);             partB.ChangeCount(11, mediator);            Console.WriteLine("A 現在的錢是:{0}", partA.MoneyCount);            Console.WriteLine("B 現在的錢是:{0}", partB.MoneyCount); 

 

四、優缺點及其適用場景

優點:

1)將各個對象類解耦,同時簡化對象之間的關系,使系統變為松耦合。

2)系統更加靈活,各個對象獨立而易于復用。

缺點:

1)中介者模式中,中介者承擔了較大的責任,一旦中介者出現問題,整個系統都會受到較大的影響。

2)新增一個對象類,需要修改抽象中介者和具體中介者類。

 

適用場景:

中介者模式一般應用于一組對象以定義良好但是復雜的方式進行通信的場合,及想定制一個分布在多個類中的行為,而又不想生成太多的子類的場合。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永宁县| 黔南| 科技| 永德县| 佛坪县| 凤凰县| 磐安县| 清水河县| 北海市| 新安县| 加查县| 沅江市| 南漳县| 宣恩县| 钟祥市| 深水埗区| 昂仁县| 蕲春县| 恭城| 远安县| 赤城县| 梁山县| 图们市| 荣昌县| 诏安县| 攀枝花市| 武乡县| 汨罗市| 辉县市| 江都市| 九台市| 磐安县| 泽库县| 澄江县| 光山县| 华池县| 吉木乃县| 九江市| 黑龙江省| 韶山市| 苍南县|