设计模式-行为型之中介者模式

理解中介者模式在面向对象设计中的应用
本文深入探讨了中介者模式在面向对象设计中的核心作用,通过实例展示了如何使用中介者模式减少对象之间的复杂引用关系,降低耦合度,并提供了具体的代码示例来说明实现过程。

模式动机

   在面向对象设计中,如果一个对象会影响其他对象,同时也要被其他对象影响,那么我们可以称这两个对象为同事类(Colleague),同事类一般由多个组成,他们之间相互影响,相互依赖。同事类越多,关系越复杂。多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,如下图:
   图一
   此时,当其中一个对象发生变化时,与之关联的很多对象都会受到影响,可谓是“牵一发而动全身”。此时我们需要引入一个中介者,减少对象两两之间复杂的引用关系,使之成为一个松耦合的结构,如下图:
   图二
   可以看到,之前复杂的网状结构在加入了中介者之后,变成了更简单清晰度的星型结构。这个中介者负责维护各个对象之间的引用关系。大大降低了耦合度。

模式定义

  用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

模式结构

模式结构
  抽象中介者:Mediator,定义接口用于各同事对象进行通信
  具体中介者:ConcreteMediator
  抽象同事者:Colleague,定义接口与中介者协作,通过中介者与其他同事进行通信
  具体同事者:ConcreteColleague

代码示例

  我们以单身男、单身女、媒人为例简单模拟一下中介者模式。单身男、单身女互为同事类,媒人相当于我们的中介者。

//抽象中介者
public abstract class Mediator {
    public abstract void passMessage(SingleDog sender,String s);
}
//具体中介者-媒人,介绍人
public class MatchMaker extends Mediator{
    @Override
    public void passMessage(SingleDog sender,String s) {
        System.out.println("媒人转达"+sender.getName()+"的话:"+s);
    }
}
//抽象同事类-单身狗
public abstract class SingleDog {
    protected Mediator mediator; 
    protected String name;

    public abstract void say(String s);

    public SingleDog(String name){
        this.name = name;
    }
    public Mediator getMediator() {
        return mediator;
    }
    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
//具体同事类-单身男
public class SingleBoy extends SingleDog{
    public SingleBoy(String name) {
        super(name);
    }
    @Override
    public void say(String s) {
        mediator.passMessage(this,s);
    }
}
//具体同事类-单身女
public class SingleGirl extends SingleDog{
    public SingleGirl(String name) {
        super(name);
    }
    @Override
    public void say(String s) {
        mediator.passMessage(this,s);
    }
}
//客户端测试
public class Client {
    public static void main(String[] args) {
        Mediator mediator = new MatchMaker();
        SingleDog girl = new SingleGirl("韩梅梅");
        SingleDog boy = new SingleBoy("李雷");
        girl.setMediator(mediator);
        boy.setMediator(mediator);
        girl.say("你有房么?");//媒人转达韩梅梅的话:你有房么?
        boy.say("我有房!");//媒人转达李雷的话:我有房!
        girl.say("你有车么?");//媒人转达韩梅梅的话:你有车么?
        boy.say("我有车!");//媒人转达李雷的话:我有车!
        girl.say("成交!");//媒人转达韩梅梅的话:成交!
        boy.say("成交!");//媒人转达李雷的话:成交!
    }
}

总结

  中介者主要有如下两方面的作用:
  中转作用(结构性):通过中介者提供的中转作用,各个同事对象就不再需要显式引用其他同事,当需要和其他同事进行通信时,通过中介者即可。该中转作用属于中介者在结构上的支持。
  协调作用(行为性):中介者可以更进一步的对同事之间的关系进行封装,同事可以一致地和中介者进行交互,而不需要指明中介者需要具体怎么做,中介者根据封装在自身内部的协调逻辑,对同事的请求进行进一步处理,将同事成员之间的关系行为进行分离和封装。该协调作用属于中介者在行为上的支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值