JAVA设计模式-中介者模式-以传话为例

简介

中介者模式定义

定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。

来分析一下定义,其实就是说原本可能多个不同对象之间存在大量的关联交互关系,可能发生一个类的改动同时导致改动多个类,使整个系统的类结构关系复杂。然后提出一个中介对象,中介对象接受所有类对象,这些类对象由中介对象来负责彼此的交互,从而实现对象间解耦合。本质上使将一个网状的关系结构改造成星型的关系结构,很像网上聊天的群聊系统。

这个模式的将多对多的关系改成了一对一的关系,缺点也是显而易见的,当类关系越来越复杂时,中介对象也会变得越来越复杂,会变得难以维护。

接下来我们来看案例

案例

假如在战争期间,上层需要给各个部门下发指令,各个战斗部门需要给上层回复指令。

抽象中介者

//中介者
public abstract class Mediator {
    public abstract void register(Soldier soldier);
    public abstract void replay(Soldier soldier,String message);
}

抽象士兵类

public abstract class Soldier {
    //需要维护一个中介者,通过中介者交互
    protected Mediator mediator;
    public void setMediator(Mediator mediator)
    {
        this.mediator=mediator;
    }
    public abstract void send(String message);
    public abstract void receive(String message);
}

具体中介者类

public class Messenger extends Mediator{
    private List<Soldier> soldierList=new ArrayList<>();
    @Override
    public void register(Soldier soldier) {
        if(!soldierList.contains(soldier)) {
            soldierList.add(soldier);
            soldier.setMediator(this);
        }
    }

    @Override
    public void replay(Soldier soldier, String message) {
        for(Soldier soldier1:soldierList){
            if(!soldier1.equals(soldier)){
                soldier1.receive(message);
            }
        }
    }
}

司令类(士兵具体实现类)

public class Commander extends Soldier{
    @Override
    public void send(String message) {
        System.out.println("Commander发出消息:"+message);
        mediator.replay(this,message);
    }

    @Override
    public void receive(String message) {
        System.out.println("Commander收到消息:"+message);
    }
}

参谋类(士兵具体实现类)

public class Officer extends Soldier{
    @Override
    public void send(String message) {
        System.out.println("Officer发出消息:"+message);
        mediator.replay(this,message);
    }

    @Override
    public void receive(String message) {
        System.out.println("Officer收到消息:"+message);
    }
}

测试

    @Test
    public void test()
    {
        Messenger messenger = new Messenger();
        Commander commander = new Commander();
        Officer officer = new Officer();
        messenger.register(commander);
        messenger.register(officer);
        commander.send("你在说什么");
        officer.send("我说,总座高见");
    }

测试结果

Commander发出消息:你在说什么
Officer收到消息:你在说什么
Officer发出消息:我说,总座高见
Commander收到消息:我说,总座高见

总结

中介者模式中,中介维护所有的类对象,每个类对象需要维护一个中介,然后彼此通过各自的中介来进行交互。这里举的例子非常的简单,在实际中这两个类可能是完全不同的类,也可能会有更多种类的类参与中介者模式。不过大体的交互思路是类似的,只是中介者会变得更加复杂,且中介者类与类间交互的方法也会更加复杂。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值