设计模式:中介者模式

参考
设计模式入门——中介者模式(mediator)
23种设计模式(7):中介者模式

中介者模式

类型:行为型

在这里插入图片描述
这个中介者负责与对象之间联系,对象与对象之间不再进行直接的交互,也就是对对象关系进行解耦

角色

  • 抽象中介者(mediator):定义一个接口用于和对象通信(SmartDevice)
  • 具体中介者(concretemediator):协调各同事对象实现协作,了解维护各个同事()
  • 抽象同事角色(colleague):规定了同事的基本类型
  • 具体同事角色(concreteColleague):每个同事都知道中介者对象,要与同事通信则把通信告诉中介者

UML

在这里插入图片描述

包结构

在这里插入图片描述

同事类

基类
package 中介者模式.colleague;

public abstract class AbstractColleague {
    protected String book;

    public String getBook() {
        return book;
    }

    public void setBook(String book) {
        this.book = book;
    }
}
具体子类
package 中介者模式.colleague;

import 中介者模式.mediator.AbstractMediator;

public class Wang extends AbstractColleague{
    public void giveBookToZhang(AbstractMediator mediator){
        System.out.println("老王将书"+book+"给了中介者");
        mediator.wangGiveZhang(super.book);
    }
}
---------------------------------------------------------------
package 中介者模式.colleague;

import 中介者模式.mediator.AbstractMediator;

public class Zhang extends AbstractColleague{
    public void giveBookToWang(AbstractMediator mediator){
        System.out.println("老张将书"+book+"给了中介者");
        mediator.zhangGiveWang(super.book);
    }
}

中介者

基类
package 中介者模式.mediator;

import 中介者模式.colleague.AbstractColleague;

public abstract class AbstractMediator {
    protected AbstractColleague wang;
    protected AbstractColleague zhang;

    public AbstractMediator(AbstractColleague wang, AbstractColleague zhang) {
        this.wang = wang;
        this.zhang = zhang;
    }

    public abstract void wangGiveZhang(String book);
    public abstract void zhangGiveWang(String book);
}
具体子类
package 中介者模式.mediator;

import 中介者模式.colleague.AbstractColleague;

public class Mediator extends AbstractMediator {

    public Mediator(AbstractColleague wang, AbstractColleague zhang) {
        super(wang, zhang);
    }

    @Override
    public void wangGiveZhang(String book) {
        System.out.println("中介者得到了老王给来的书"+book+"并交给了老张");
        super.zhang.setBook(book);
    }

    @Override
    public void zhangGiveWang(String book) {
        System.out.println("中介者得到了老张给来的书"+book+"并交给了老王");
        super.wang.setBook(book);
    }
}

客户端

package 中介者模式.client;

import 中介者模式.colleague.AbstractColleague;
import 中介者模式.colleague.Wang;
import 中介者模式.colleague.Zhang;
import 中介者模式.mediator.AbstractMediator;
import 中介者模式.mediator.Mediator;

public class Client {
    public static void main(String[] args) {
        Wang wang = new Wang();
        Zhang zhang = new Zhang();
        AbstractMediator mediator = new Mediator(wang,zhang);
        System.out.println("--------先让老王获得书--------");
        wang.setBook("《假如我有三天光明》");
        System.out.println("---------再让老王把书给老张---------");
        wang.giveBookToZhang(mediator);
        System.out.println("-----------查看老张手上的书-----------");
        System.out.println(zhang.getBook());
    }
}

效果

--------先让老王获得书--------
---------再让老王把书给老张---------
老王将书《假如我有三天光明》给了中介者
中介者得到了老王给来的书《假如我有三天光明》并交给了老张
-----------查看老张手上的书-----------
《假如我有三天光明》

Process finished with exit code 0

​ 模式优缺点

中介者模式很容易在系统中应用,也很容易在系统中误用,当系统出现了‘多对多’交互复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。

优点:

  • Mediator的出现减少了各个Colleague的耦合,使得可以独立的改变复用各个ColleagueMediator;
  • 由于把对象如何协作进行了抽象,将中介者作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到了他们之间的交互上来,也就是站在一个更宏观的角度去看待系统

缺点

  • 由于ConcreteMediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个ConcreteColleague都复杂
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值