`

MEDIATOR(中介者)——对象行为型模式

 
阅读更多
1、意图
    用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
2.动机
    面向对象设计鼓励将行为分布到各个对象中。这种分布可能会导致对象间有许多连接。在最坏的情况下,每一个对象都知道其他所有对象。
    虽然将一个系统分割成许多对象通常可以增加复用性,但是对象间相互连接的激增又会降低其可复用性。大量的相互连接使得一个对象似乎不太可能在没有其他对象的支持下工作——系统表现为一个不可分割的整体。而且,对系统的行为进行任何较大的改动都十分困难,因为行为被分布在许多对象中。结果是,你可能不得不定义很多子类以定制系统的行为。
    可以通过将集体行为封装在一个单独的中介者(mediator)对象中以避免这个问题。中介者负责控制和协调一组对象的交互。中介者充当一个中介以使组中的对象不再相互显示引用。这些对象仅知道中介者,从而减少了相互连接的数目。
3、适用性
    在下列情况下使用中介者模式:
    一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
    一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
    想定制一个分布在多个类中的行为,而有不像生成太多的子类。
4、结构


5、参与者
Mediator(中介者,如DialogDirector)
——中介者定义一个接口用于与各同事(Colleague)对象通信
ConcreteMediator(具体中介者,如FontDialogDirector)
——具体中介者通过协调各同事对象实现协调行为。
——了解并维护它的各个同事。
Colleague class(同事类,如ListBox,EntryField)
——每一个同事类都知道它的中介者对象。
——每一个同事对象都在需要与其他的同事通信的时候,与它的中介者通信。
6、代码实例

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;
 
//Colleague interface
interface Command {
    void execute();
}
 
//Abstract Mediator
interface IMediator {
    public void book();
    public void view();
    public void search();
    public void registerView(BtnView v);
    public void registerSearch(BtnSearch s);
    public void registerBook(BtnBook b);
    public void registerDisplay(LblDisplay d);
}
 
//Concrete mediator
class Mediator implements IMediator {
 
    BtnView btnView;
    BtnSearch btnSearch;
    BtnBook btnBook;
    LblDisplay show;
 
    //....
    public void registerView(BtnView v) {
        btnView = v;
    }
 
    public void registerSearch(BtnSearch s) {
        btnSearch = s;
    }
 
    public void registerBook(BtnBook b) {
        btnBook = b;
    }
 
    public void registerDisplay(LblDisplay d) {
        show = d;
    }
 
    public void book() {
        btnBook.setEnabled(false);
        btnView.setEnabled(true);
        btnSearch.setEnabled(true);
        show.setText("booking...");
    }
 
    public void view() {
        btnView.setEnabled(false);
        btnSearch.setEnabled(true);
        btnBook.setEnabled(true);
        show.setText("viewing...");
    }
 
    public void search() {
        btnSearch.setEnabled(false);
        btnView.setEnabled(true);
        btnBook.setEnabled(true);
        show.setText("searching...");
    }
 
}
 
//A concrete colleague
class BtnView extends JButton implements Command {
 
    IMediator med;
 
    BtnView(ActionListener al, IMediator m) {
        super("View");
        addActionListener(al);
        med = m;
        med.registerView(this);
    }
 
    public void execute() {
        med.view();
    }
 
}
 
//A concrete colleague
class BtnSearch extends JButton implements Command {
 
    IMediator med;
 
    BtnSearch(ActionListener al, IMediator m) {
        super("Search");
        addActionListener(al);
        med = m;
        med.registerSearch(this);
    }
 
    public void execute() {
        med.search();
    }
 
}
 
//A concrete colleague
class BtnBook extends JButton implements Command {
 
    IMediator med;
 
    BtnBook(ActionListener al, IMediator m) {
        super("Book");
        addActionListener(al);
        med = m;
        med.registerBook(this);
    }
 
    public void execute() {
        med.book();
    }
 
}
 
class LblDisplay extends JLabel {
 
    IMediator med;
 
    LblDisplay(IMediator m) {
        super("Just start...");
        med = m;
        med.registerDisplay(this);
        setFont(new Font("Arial", Font.BOLD, 24));
    }
 
}
 
class MediatorDemo extends JFrame implements ActionListener {
 
    IMediator 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();
    }
 
}
  • 大小: 51.2 KB
分享到:
评论

相关推荐

    C#面向对象设计模式纵横谈(17):(行为型模式) Mediator 中介者模式

    标题和描述均提到了"C#面向对象设计模式纵横谈(17):(行为型模式) Mediator 中介者模式",这明确指向了一个特定的设计模式——中介者模式(Mediator Pattern),并且是在C#语言环境下的应用。下面将详细阐述这一设计...

    C#面向对象设计模式纵横谈(17):(行为型模式) Mediator 中介者模式 (Level 300)

    **中介者模式(Mediator Pattern)**是一种行为设计模式,其主要目的是降低多个对象之间的通信复杂性,将这些对象的直接交互转化为与一个中心对象——中介者的交互。在C#中,中介者模式的应用能够有效地减少类之间的...

    mediator模式

    中介者模式将这些依赖关系集中到一个单独的对象——中介者上,使得各个对象只与中介者进行交互,而不再直接与其他对象通信。 在提供的文件列表中,我们可以看到以下组件: 1. `DepModel.java` 和 `DepUserModel....

    设计模式可复用面向对象软件的基础.zip

    5.5 MEDIATOR(中介者)—对象行为型 模式 181 5.6 MEMENTO(备忘录)—对象行为型 模式 188 5.7 OBSERVER(观察者)—对象行为型 模式 194 5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为...

    设计模式 - 中介者模式

    中介者模式是一种行为设计模式,它用于减少多个对象之间的复杂交互,将这些对象通过一个共同的对象——中介者联系起来,使得各对象之间不再直接引用,而是通过中介者进行通信。这种模式降低了对象间的耦合度,提高了...

    设计模式之中介模式Java实现版本

    中介模式(Mediator Pattern)属于行为设计模式,它旨在降低多个对象之间的复杂交互,通过引入一个中介对象来封装原本复杂的网状结构,使得这些对象之间的通信变得简单和可复用。在Java中,我们可以很容易地实现这个...

    design-pattern-java.pdf

    遍历聚合对象中的元素——迭代器模式(四) 遍历聚合对象中的元素——迭代器模式(五) 遍历聚合对象中的元素——迭代器模式(六) 中介者模式-Mediator Pattern 协调多个对象之间的交互——中介者模式(一) 协调多...

    X-gen PPT下载——《研磨设计模式》 实战

    3. **行为型模式**:包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式(Memento)、观察者模式...

    23种 设计模式---面向对象的基本原则

    - 中介者模式(Mediator):用一个中介对象来封装一系列的对象交互,降低系统的耦合度。 - 备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后恢复...

    设计模式精解——GoF23中设计模式解析

    6. **Mediator模式**:用一个中介对象来封装一系列的对象交互,使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。这种模式适用于对象之间有复杂的交互,这些交互应被动态地规定...

    从实例解析中介者模式--交通信号灯

    中介者模式引入一个中心组件——交通信号控制器,作为各个信号灯之间的协调者,使得它们之间的交互通过这个中心组件进行,从而降低了耦合度。 首先,我们需要创建三个类,分别代表红、黄、绿信号灯。这些类通常包含...

    设计模式-可复用面向对象软件的基础

    其中包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式...

    设计模式

    总之,设计模式是软件开发中的宝贵财富,而中介者模式是其中一种重要的行为模式,能有效简化多对象之间的交互,提高系统的可读性和可维护性。理解和熟练运用中介者模式,对于提升软件质量有着显著的帮助。

    设计模式PPT---25种设计模式详解

    5. 中介者模式(Mediator):定义一个中介对象来简化原本复杂的对象间交互。 6. 观察者模式(Observer):当对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 7. 状态模式(State):允许一个对象...

    设计模式 让你轻松理解设计模式,提高开发效率

    中介者模式是一种行为型设计模式,它用一个中介对象来封装一系列的对象交互。该模式减少了对象间的直接依赖关系,使得各个对象之间不再显式地相互引用,而是将依赖关系转交给中介者。文章中通过“MM之间的沟通”,...

    设计模式C++版

    6. Mediator模式,中介者模式,用一个中介对象来封装一系列的对象交互。 ***mand模式,命令模式,将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化。 8. Visitor模式,访问者模式,表示一个作用于某...

    设计模式精解-GoF 23种设计模式解析附C++实现源码.pdf

    - **3.6 Mediator模式**:中介者模式用一个中介对象来封装一系列的对象交互。 - **3.7 Command模式**:命令模式将一个请求封装为一个对象,从而使用户可以用不同的请求来参数化客户端。 - **3.8 Visitor模式**:...

    JAVA设计模式--入门

    5. 中介者模式(Mediator):定义一个中介对象,协调多个对象之间的交互。 6. 备忘录模式(Memento):保存对象的状态,以便在需要时恢复。 7. 观察者模式(Observer):当对象状态改变时,通知所有依赖它的观察者。...

Global site tag (gtag.js) - Google Analytics