跳轉到內容

中介者

25% developed
來自華夏公益教科書,開放的書籍,開放的世界

迭代器 計算機科學設計模式
中介者
備忘錄

這種模式定義了一個封裝一組物件之間如何互動的物件。中介者透過阻止物件顯式地相互引用來促進鬆散耦合,並且它允許你獨立地改變它們的互動。這種模式有助於建模一個在執行時負責控制和協調一組其他物件互動的類的物件。

參與者

中介者 - 定義同事物件之間通訊的介面。具體中介者 - 實現中介者介面並協調同事物件之間的通訊。它瞭解所有同事及其在相互通訊方面的目的。具體同事 - 透過其中介者與其他同事通訊。

示例

Clipboard

待辦事項
查詢示例。


成本

這種模式並不昂貴,因為它沒有太多限制。

建立

這種模式易於建立。

維護

這種模式易於維護。

移除

每個物件都可以透過重構輕鬆地轉換為另一種結構。

建議

  • 在迭代器類的名稱中新增中介者一詞,以向其他開發人員指示模式的使用。

實現

Java 實現
// Colleague interface
interface Command {
    void execute();
}
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
// Concrete mediator
class Mediator {
    BtnView btnView;
    BtnSearch btnSearch;
    BtnBook btnBook;
    LblDisplay show;
    //....
    void registerView(BtnView v) {
        btnView = v;
    }
    void registerSearch(BtnSearch s) {
        btnSearch = s;
    }
    void registerBook(BtnBook b) {
        btnBook = b;
    }
    void registerDisplay(LblDisplay d) {
        show = d;
    }
    void book() {
        btnBook.setEnabled(false);
        btnView.setEnabled(true);
        btnSearch.setEnabled(true);
        show.setText("booking...");
    }
    void view() {
        btnView.setEnabled(false);
        btnSearch.setEnabled(true);
        btnBook.setEnabled(true);
        show.setText("viewing...");
    }
    void search() {
        btnSearch.setEnabled(false);
        btnView.setEnabled(true);
        btnBook.setEnabled(true);
        show.setText("searching...");
    }
   
}
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
// A concrete colleague
class BtnView extends JButton implements Command {
    Mediator med;
    BtnView(ActionListener al, Mediator m) {
        super("View");
        addActionListener(al);
        med = m;
        med.registerView(this);
    }
    public void execute() {
        med.view();
    }
   
}
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
// A concrete colleague
class BtnSearch extends JButton implements Command {
    Mediator med;
    BtnSearch(ActionListener al, Mediator m) {
        super("Search");
        addActionListener(al);
        med = m;
        med.registerSearch(this);
    }
    public void execute() {
        med.search();
    }
   
}
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
// A concrete colleague
class BtnBook extends JButton implements Command {
    Mediator med;
    BtnBook(ActionListener al, Mediator m) {
        super("Book");
        addActionListener(al);
        med = m;
        med.registerBook(this);
    }
    public void execute() {
        med.book();
    }
}
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
class LblDisplay extends JLabel {
    Mediator med;
    LblDisplay(Mediator m) {
        super("Just start...");
        med = m;
        med.registerDisplay(this);
        setFont(new Font("Arial", Font.BOLD, 24));
    }
}
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
class MediatorDemo extends JFrame implements ActionListener {
    Mediator med = new Mediator();
    MediatorDemo() {
        JPanel p = new JPanel();
        p.add(new BtnView(this, med));
        p.add(new BtnBook(this, med));
        p.add(new BtnSearch(this, med));
        getContentPane().add(new LblDisplay(med), "North");
        getContentPane().add(p, "South");
        setSize(400, 200);
        setVisible(true);
    }
    public void actionPerformed(ActionEvent ae) {
        Command comd = (Command) ae.getSource();
        comd.execute();
    }
    public static void main(String[] args) {
        new MediatorDemo();
    }
}
C# 實現
using System;
using System.Collections;
  class MainApp
  {
    static void Main()
    {
      ConcreteMediator m = new ConcreteMediator();
      ConcreteColleague1 c1 = new ConcreteColleague1(m);
      ConcreteColleague2 c2 = new ConcreteColleague2(m);
      m.Colleague1 = c1;
      m.Colleague2 = c2;
      c1.Send("How are you?");
      c2.Send("Fine, thanks");
      // Wait for user
      Console.Read();
    }
  }
  // "Mediator"
  abstract class Mediator
  {
    public abstract void Send(string message,
      Colleague colleague);
  }
  // "ConcreteMediator"
  class ConcreteMediator : Mediator
  {
    private ConcreteColleague1 colleague1;
    private ConcreteColleague2 colleague2;
    public ConcreteColleague1 Colleague1
    {
      set{ colleague1 = value; }
    }
    public ConcreteColleague2 Colleague2
    {
      set{ colleague2 = value; }
    }
    public override void Send(string message,
      Colleague colleague)
    {
      if (colleague == colleague1)
      {
        colleague2.Notify(message);
      }
      else
      {
        colleague1.Notify(message);
      }
    }
  }
  // "Colleague"
  abstract class Colleague
  {
    protected Mediator mediator;
    // Constructor
    public Colleague(Mediator mediator)
    {
      this.mediator = mediator;
    }
  }
  // "ConcreteColleague1"
  class ConcreteColleague1 : Colleague
  {
    // Constructor
    public ConcreteColleague1(Mediator mediator)
      : base(mediator)
    {
    }
    public void Send(string message)
    {
      mediator.Send(message, this);
    }
    public void Notify(string message)
    {
      Console.WriteLine("Colleague1 gets message: "
        + message);
    }
  }
  // "ConcreteColleague2"
  class ConcreteColleague2 : Colleague
  {
    // Constructor
    public ConcreteColleague2(Mediator mediator)
      : base(mediator)
    {
    }
    public void Send(string message)
    {
      mediator.Send(message, this);
    }
    public void Notify(string message)
    {
      Console.WriteLine("Colleague2 gets message: "
        + message);
    }
  }


Clipboard

待辦事項
新增更多插圖。


迭代器 計算機科學設計模式
中介者
備忘錄


您對本頁有疑問嗎?
在這裡詢問


在本手冊中建立一個新頁面


華夏公益教科書