JAVA设计模式——中介者模式

中介者模式,又称为调停者模式,是一种行为型设计模式。其思想是:用一个中介者对象封装一系列的对象交互,使各对象不需要显示地相互作用,从而实现松耦合结构

中介者模式涉及3个角色:

  • 抽象中介者(Mediator):中介者对象的接口,用于实现各个同事类之间的通信。
  • 具体中介者(Concrete Mediator):具体的中介者,实现抽象中介者中声明的方法。
  • 同事(Colleague):如果一个对象会影响另一个对象,同时也会被另一个对象影响,那么这两个对象称为同事类。

一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一高过度耦合的结构。
这里写图片描述
(图片来源于网络)

而中介者的作用,就是将这种网状结构转化为星型结构
这里写图片描述
(图片来源于网络)

结构图:
这里写图片描述

具体代码实现:

同事:

public abstract class Colleague {
    protected int num;

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public abstract void setNum(int num, Mediator mediator);
}

public class ColleagueA extends Colleague {
    public ColleagueA() {
        this.num = 10000;
    }

    @Override
    public void setNum(int num, Mediator mediator) {
        this.num = num;
        mediator.affectB(num); // A的改变同时影响B
    }
}

public class ColleagueB extends Colleague {
    public ColleagueB() {
        this.num = 100;
    }

    @Override
    public void setNum(int num, Mediator mediator) {
        this.num = num;
        mediator.affectA(num); // B的改变同时影响A
    }
}

中介者:

public interface Mediator {
    void affectA(int num);

    void affectB(int num);
}

public class ConcreteMediator implements Mediator {
    private Colleague a = new ColleagueA();
    private Colleague b = new ColleagueB();

    public ConcreteMediator(Colleague a, Colleague b) {
        this.a = a;
        this.b = b;
    }

    @Override
    public void affectA(int num) {
        a.setNum(num * 100);
    }

    @Override
    public void affectB(int num) {
        b.setNum(num / 100);
    }
}

客户:

public class Client {
    public void method() {
        Colleague a = new ColleagueA();
        Colleague b = new ColleagueB();
        Mediator mediator = new ConcreteMediator(a, b);
        System.out.printf("a=%d b=%d\n", a.getNum(), b.getNum()); // 打印初始化之后a,b的值


        a.setNum(11100, mediator); // 改变a的值
        System.out.printf("a=%d b=%d\n", a.getNum(), b.getNum());

        b.setNum(123, mediator); // 改变b的值
        System.out.printf("a=%d b=%d\n", a.getNum(), b.getNum());
    }
}

// 测试
class MediatorTest {
    public static void main(String[] args) {
        Client client = new Client();
        client.method();
    }
}

运行结果:

a=10000 b=100
a=11100 b=111
a=12300 b=123


中介者模式是一种比较重要的设计模式。例如,MVC框架就是一个常见的中介者模式的实现,MVC当中的C(控制器)就是M(模型)和V(视图)的中介者。

中介者模式同时也是一种比较容易被滥用的模式。适当的使用中介者模式可以使原本凌乱的对象关系清晰,但是如果滥用,则可能会带来反的效果。一般来说,只有对于那种同事类之间是网状结构的关系,才会考虑使用中介者模式,将网状结构变为星状结构,使同事类之间的关系变的清晰一些。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值