设计模式(十七)中介者
一、定義
義一個對象來封裝一系列的對象交互。中介者模式使各對象不需要顯示地相互引用,從而使其耦合松散,而且可以讓你相對獨立地改變它們之間的交互。中介者模式又稱為調(diào)停模式,它是一種對象說行為型模式。
二、描述
在中介者模式中,引入了用于協(xié)調(diào)其他對象/類之間的相互調(diào)用的中介者類,為了讓系統(tǒng)具有更好的靈活性和可擴(kuò)展性,通常還提供了抽象中介者,包含以下四個角色:1、Mediator(抽象中介者):它定義了一個接口,該接口用于與各同事對象之間進(jìn)行通信。
2、ConcreteMediator(具體中介者):它是抽象中介者的子類,通過協(xié)調(diào)各個同事對象來實現(xiàn)協(xié)作行為,維持了各個同事對象的引用。
3、Colleague(抽象同事類):它定義了各個同事類公有的方法,并聲明了一些抽象方法來供子類實現(xiàn),同時維持了一個對抽象中介者類的引用,其子類可以通過該引用來與中介者通信。
4、ConcreteColleague(具體同事類):它是抽象同事類的子類,每一個同事對象需要和其他對象通信時,先與中介者對象通信,通過中介者來間接完成與其他同事類的通信,在具體同事類中實現(xiàn)了在抽象同事類中聲明的抽象方法。
三、例子
X公司欲開發(fā)一套CRM系統(tǒng),其中包含一個客戶信息管理模塊,界面包含了按鈕、文本框、列表框、下拉框等多個組件,增加或刪除一個客戶,各組件均會發(fā)生聯(lián)動效果,較為復(fù)雜。
Mediator:抽象中介者
public abstract class Mediator
{
public abstract void ComponenetChanged(Component c);
}
ConcreteMediator:具體中介者
public class ConcreteMediator : Mediator
{
// 維持對各個同事對象的引用
public Button addButton;
public List list;
public TextBox userNameTextBox;
public ComboBox cb;
// 封裝同事對象之間的交互
public override void ComponenetChanged(Component c)
{
// 單擊按鈕
if (c == addButton)
{
Console.WriteLine("-- 單擊增加按鈕 --");
list.Update();
cb.Update();
userNameTextBox.Update();
}
// 從列表框選擇客戶
else if (c == list)
{
Console.WriteLine("-- 從列表框選擇客戶 --");
cb.Select();
userNameTextBox.SetText();
}
// 從組合框選擇客戶
else if (c == cb)
{
Console.WriteLine("-- 從組合框選擇客戶 --");
cb.Select();
userNameTextBox.SetText();
}
}
}
Component:抽象組件,充當(dāng)抽象同事類(Colleague)
public abstract class Component
{
protected Mediator mediator;
public void SetMediator(Mediator mediator)
{
this.mediator = mediator;
}
// 轉(zhuǎn)發(fā)調(diào)用
public void Changed()
{
mediator.ComponenetChanged(this);
}
public abstract void Update();
}
Button、List、ComboBox、TextBox:按鈕、列表框、組合框、文本框,具體組件,充當(dāng)具體同事類(ConcreteColleague)
public class Button : Component
{
public override void Update()
{
// 按鈕不產(chǎn)生響應(yīng)
}
}
public class List : Component
{
public override void Update()
{
Console.WriteLine("列表框增加一項:張無忌");
}
public void Select()
{
Console.WriteLine("列表框選中項:小龍女");
}
}
public class ComboBox : Component
{
public override void Update()
{
Console.WriteLine("組合框增加一項:張無忌");
}
public void Select()
{
Console.WriteLine("組合框選中項:小龍女");
}
}
public class TextBox : Component
{
public override void Update()
{
Console.WriteLine("客戶信息增加成功后文本框清空");
}
public void SetText()
{
Console.WriteLine("文本框顯示:小龍女");
}
}
Program:客戶端測試類
// Step1.定義中介者對象
ConcreteMediator mediator = new ConcreteMediator();
// Step2.定義同事對象
Button addButton = new Button();
List list = new List();
ComboBox cb = new ComboBox();
TextBox userNameTextBox = new TextBox();
addButton.SetMediator(mediator);
list.SetMediator(mediator);
cb.SetMediator(mediator);
userNameTextBox.SetMediator(mediator);
mediator.addButton = addButton;
mediator.list = list;
mediator.cb = cb;
mediator.userNameTextBox = userNameTextBox;
// Step3.點擊增加按鈕
addButton.Changed();
Console.WriteLine("---------------------------------------------");
// Step4.從列表框選擇客戶
list.Changed();
Console.ReadLine();
四、總結(jié)
1、優(yōu)點
(1)中介者模式簡化了對象之間的交互,它用中介者和同事的一對多交互代替了原來同事之間的多對多交互,一對多關(guān)系更容易理解、維護(hù)和擴(kuò)展,將原本難以理解的網(wǎng)狀結(jié)構(gòu)轉(zhuǎn)換成相對簡單的星形結(jié)構(gòu)。
(2)可將各同事對象解耦,中介者模式有利于各同事之間的松耦合,可以獨立地改變和復(fù)用每一個同事和中介者,增加新的中介者類和新的同事類都比較方便,更好地符合開閉原則。
(3)可以減少子類的生成,中介者模式將原本分布于多個對象間的行為集中在一起,改變這些行為只需生成新的中介者子類即可,這使得各個同事類可被重用,無須直接對同事類進(jìn)行擴(kuò)展。
2、缺點
(1)具體中介者子類中包含了大量的同事之間的交互細(xì)節(jié),可能會導(dǎo)致具體中介者類非常復(fù)雜,使得系統(tǒng)難以維護(hù)。
總結(jié)
以上是生活随笔為你收集整理的设计模式(十七)中介者的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 便携、高效、摆脱有线束缚,价格亲民的蒲公
- 下一篇: java信息管理系统总结_java实现科