设计模式——中介者模式


作者:云都小生

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


概述



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

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


中介者模式角色



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

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

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

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

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


代码案例



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

一般人设计后的关系图是这样···
这里写图片描述

而正确的设计是····
这里写图片描述

//抽象中介者
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标签,当鼠标单击的时候就进行怎样的交互。我们可以增加一个新的中介者,又或者是在原来的中介者基础上进行扩展。


总结



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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值