調停者模式包裝了一系列對象相互做用的方式,使得這些對象沒必要相互明顯引用。從而使它們能夠較鬆散地耦合。當這些對象中的某些對象之間的相互做用發生改變時,不會當即影響到其餘的一些對象之間的相互做用。從而保證這些相互做用能夠彼此獨立地變化。html
抽象調停者(Mediator)角色:定義出同事對象到調停者對象的接口,其中主要方法是一個(或多個)事件方法。
具體調停者(ConcreteMediator)角色:實現了抽象調停者所聲明的事件方法。具體調停者知曉全部的具體同事類,並負責具體的協調各同事對象的交互關係。
抽象同事類(Colleague)角色:定義出調停者到同事對象的接口。同事對象只知道調停者而不知道其他的同事對象。
具體同事類(ConcreteColleague)角色:全部的具體同事類均從抽象同事類繼承而來。實現本身的業務,在須要與其餘同事通訊的時候,就與持有的調停者通訊,調停者會負責與其餘的同事交互。java
一、鬆散耦合:調停者模式經過把多個同事對象之間的交互封裝到調停者對象裏面,從而使得同事對象之間鬆散耦合,基本上能夠作到互補依賴。這樣一來,同事對象就能夠獨立地變化和複用,而再也不像之前那樣「牽一處而動全身」了。
二、集中控制交互:多個同事對象的交互,被封裝在調停者對象裏面集中管理,使得這些交互行爲發生變化的時候,只須要修改調停者對象就能夠了,固然若是是已經作好的系統,那麼就擴展調停者對象,而各個同事類不須要作修改。
三、多對多變成一對多:沒有使用調停者模式的時候,同事對象之間的關係一般是多對多的,引入調停者對象之後,調停者對象和同事對象的關係一般變成雙向的一對多,這會讓對象的關係更容易理解和實現。ide
調停者模式的一個潛在缺點是,過分集中化。若是同事對象的交互很是多,並且比較複雜,當這些複雜性所有集中到調停者的時候,會致使調停者對象變得十分複雜,並且難於管理和維護。this
參考網上的示例,電腦播放電影的例子,進行調停者模式的實現。類圖以下:spa
IMediator定義:.net
package com.lidaming.design21.mediator; public interface IMediator { void changed(Colleage c); }
Colleage定義:code
package com.lidaming.design21.mediator; public abstract class Colleage { private IMediator mediator; public Colleage(IMediator m) { mediator = m; } public IMediator getMediator() { return mediator; } }
CDDriver實現:htm
package com.lidaming.design21.mediator; public class CDDriver extends Colleage { private String data; public CDDriver(IMediator m) { super(m); } public void readCD() { data = "voice,vedio"; getMediator().changed(this); } public String getData() { return data; } }
CPU的實現:對象
package com.lidaming.design21.mediator; public class CPU extends Colleage { private String vedioData; private String soundData; public CPU(IMediator m) { super(m); } public String getVedioData() { return vedioData; } public String getSoundData() { return soundData; } public void processData(String data) { String[] arr = data.split(","); soundData = arr[0]; vedioData = arr[1]; getMediator().changed(this); } }
SoundCard的實現:blog
package com.lidaming.design21.mediator; public class SoundCard extends Colleage { public SoundCard(IMediator m) { super(m); } public void soundData(String data) { System.out.println("sound data:"+data); } }
VedioCard的實現:
package com.lidaming.design21.mediator; public class VedioCard extends Colleage { public VedioCard(IMediator m) { super(m); } public void showData(String data) { System.out.println("show data:"+data); } }
MainBoard的實現:
package com.lidaming.design21.mediator; public class MainBoard implements IMediator { private CDDriver cd; private CPU cpu; private SoundCard sound; private VedioCard vedio; public void changed(Colleage c) { if(c.getClass().getSimpleName().equals(CDDriver.class.getSimpleName())) { CDDriver cdd=(CDDriver)c; cpu.processData(cdd.getData()); } else if(c.getClass().getSimpleName().equals(CPU.class.getSimpleName())) { CPU cp=(CPU)c; String soundData = cp.getSoundData(); String vedioData = cp.getVedioData(); sound.soundData(soundData); vedio.showData(vedioData); } } public CDDriver getCd() { return cd; } public void setCd(CDDriver cd) { this.cd = cd; } public CPU getCpu() { return cpu; } public void setCpu(CPU cpu) { this.cpu = cpu; } public SoundCard getSound() { return sound; } public void setSound(SoundCard sound) { this.sound = sound; } public VedioCard getVedio() { return vedio; } public void setVedio(VedioCard vedio) { this.vedio = vedio; } }
場景類的實現:
package com.lidaming.design21.mediator; public class Client { public static void main(String[] args) { MainBoard mainBoard = new MainBoard(); CDDriver cdDriver = new CDDriver(mainBoard); CPU cpu = new CPU(mainBoard); SoundCard soundCard = new SoundCard(mainBoard); VedioCard vedioCard = new VedioCard(mainBoard); mainBoard.setCd(cdDriver); mainBoard.setCpu(cpu); mainBoard.setSound(soundCard); mainBoard.setVedio(vedioCard); cdDriver.readCD(); } }
參考
http://www.cnblogs.com/java-my-life/archive/2012/06/20/2554024.htmlhttp://blog.csdn.net/undoner/article/details/8898675