欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式——中介者模式

程序员文章站 2024-03-23 08:26:58
...

作者:云都小生

推荐资料:史上最全设计模式导学目录(完整版)


概述



在学习这个模式之前,我们先来回顾一下一个面向对象的设计原则——迪米特原则,这个原则告诉我们:一个对象尽可能少跟其他对象进行关联,就像一个人要少跟陌生人说话一样。

而中介者模式,也正是为了协调多个对象之间复杂的引用关系。我们来看一个例子,虽然这个例子不太好,后期想个好一点的例子再改。


中介者模式角色



在中介者模式中,主要是引入了中介者角色,分别是抽象中介者具体中介者,封装了各个对象之间共同的交互方法。

抽象同事类:定义了各个同事类共有的方法,它维持着一个抽象中介者类的引用。

具体同事类:它是抽象同事类的子类,每一个同事对象都需要通过中介者与其他同事类进行通信。

你会发现,这样我们就重新构造出了一张关系网:

这样就对同事对象之间的关系行为进行了分离和封装。


代码案例



在面向组件开发时,我们经常会使用到一些按钮、下拉菜单、标签等控件。问题来了,如果我们希望按钮一按下,下拉菜单就进行改变,或者希望按钮单击后,标签内容就进行改变··· 这就意味着,各个控件之间需要有一个关联的关系。

一般人设计后的关系图是这样···
设计模式——中介者模式

而正确的设计是····
设计模式——中介者模式

//抽象中介者
abstract class Mediator {
    public abstract void componentChanged(Control c);
}

//具体中介者
public class ConcreteMediator extends Mediator{
    public Button button;  
    public List list;  
    public Image image;  

    //封装同事对象之间的交互  
    public void componentChanged(Control c) {  
        //单击按钮  
        if(c == button) {  
            System.out.println("--单击增加按钮--");  
            list.update();  
            image.update();  
        }  
        //从列表框选择客户  
        else if(c == image) {  
            System.out.println("--单击了图片--");  
            button.update();  
            list.update();  
        }  
        //从组合框选择客户  
        else if(c == list) {  
            System.out.println("--从组合框选择客户--");  
            image.update();  
            button.update();  
        }  
    }  
}

//抽象同事类
abstract class Control {
    protected Mediator mediator;

    public void SetMediator(Mediator mediator)
    {
        this.mediator = mediator;
    }

    public void Changed()
    {
        mediator.componentChanged(this);
    }

    public abstract void update();

    public abstract void select();
}

//具体同事类:按钮
public class Button extends Control{
    public void update() 
    {
        System.out.println("按钮进行了更新!");
    }

    public void select() 
    {
        System.out.println("按钮被选中!");
    }
}

//具体同事类:列表
public class List extends Control{
    public void update() 
    {
        System.out.println("列表框进行了更新!");
    }

    public void select() 
    {
        System.out.println("列表框被选中!");
    }
}

//具体同事类:图片
public class Image extends Control{
    public void update() 
    {
        System.out.println("图片进行了更新!");
    }

    public void select() 
    {
        System.out.println("图片被选中!");
    }
}

public class Test {
    public static void main(String[] args) {
        ConcreteMediator mediator;  
        mediator = new ConcreteMediator();  

        //定义同事对象  
        Button button = new Button();  
        List list = new List();  
        Image image = new Image();  

        button.SetMediator(mediator);  
        list.SetMediator(mediator);  
        image.SetMediator(mediator);  

        mediator.button = button;  
        mediator.list = list;  
        mediator.image = image;  

        button.Changed();  
        System.out.println("-----------------------------");  
        image.Changed();
    }
}

这样一设计,我们就对各个同事类之间的交互进行了解耦。而且,如果我们相加一个Lable标签,当鼠标单击的时候就进行怎样的交互。我们可以增加一个新的中介者,又或者是在原来的中介者基础上进行扩展。


总结



中介者模式的核心在于,对多个对象之间的交互进行了解耦。缺点相信大家都看到了,如果按照上面去设计,得主动去设定各个控件之前的关系,代码很冗长。而且,具体中介者包含了大量交互的细节,使中介者变得难以维护。

相关标签: 中介者模式