设计模式之中介者模式笔记

说明

记录下学习设计模式-中介者模式的写法。JDK使用版本为1.8版本。

Mediator(中介者)

意图:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
结构:
在这里插入图片描述

其中:

  • Mediator(中介者)定义一个接口用于各同事(Colleague)对象通信。
  • ConcreteMediator(具体中介者)通过协调各同事对象实现协作行为;了解并维护它的各个同事。
  • ConcreteSubject(具体目标)将有关状态存入各ConcreteObserver对象;当它的状态发生改变时,向它的各个观察者发出通知。
  • Colleague class(同事类)知道它的中介者对象;每一个同事类对象在需要与其他同事通信的时候与它的中介者通信。

适用性:

  • 一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解。
  • 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
  • 想定制一个分布在多个类中的行为,而又不想生成太多的子类。

目录

在这里插入图片描述

中介者模式示例类图

在这里插入图片描述
以该UML类图实现中介者模式示例。

抽象中介者类

package com.example.deesign_patterns.mediator;

//抽象中介者类
public abstract class Mediator {

    //联系方法
    public abstract void contact(String message,Person person);
}

抽象同事类

package com.example.deesign_patterns.mediator;

//抽象同事类
public abstract class Person {

    protected String name;
    protected Mediator mediator;

    public Person(String name, Mediator mediator) {
        this.name = name;
        this.mediator = mediator;
    }
}

租房者类

package com.example.deesign_patterns.mediator;

//租房者类,具体的同事角色类
public class Tenant extends Person{

    public Tenant(String name, Mediator mediator) {
        super(name, mediator);
    }

    //和中介联系(沟通)的方法
    public void contact(String message){
        mediator.contact(message,this);
    }

    //获取信息的方法
    public void getMessage(String message){
        System.out.println("租房者"+name+"获取到的信息是:"+message);
    }
}

房主类

package com.example.deesign_patterns.mediator;

//房主类,具体的同事角色类
public class HouseOwner extends Person{

    public HouseOwner(String name, Mediator mediator) {
        super(name, mediator);
    }

    //和中介联系(沟通)的方法
    public void contact(String message){
        mediator.contact(message,this);
    }

    //获取信息的方法
    public void getMessage(String message){
        System.out.println("房主"+name+"获取到的信息是:"+message);
    }
}

具体的中介者角色类

package com.example.deesign_patterns.mediator;

//具体的中介者角色类
public class MediatorStructure extends Mediator{

    //聚合租房者和房主对象
    private Tenant tenant;
    private HouseOwner houseOwner;

    public Tenant getTenant() {
        return tenant;
    }

    public void setTenant(Tenant tenant) {
        this.tenant = tenant;
    }

    public HouseOwner getHouseOwner() {
        return houseOwner;
    }

    public void setHouseOwner(HouseOwner houseOwner) {
        this.houseOwner = houseOwner;
    }

    @Override
    public void contact(String message, Person person) {
        if(person==houseOwner){
            tenant.getMessage(message);
        }else {
            houseOwner.getMessage(message);
        }
    }
}

测试类

package com.example.deesign_patterns.mediator;

//测试类
public class Client {

    public static void main(String[] args) {
        //创建中介者对象
        MediatorStructure mediator=new MediatorStructure();
        //创建租房者对象
        Tenant tenant=new Tenant("李四",mediator);
        //创建房主对象
        HouseOwner houseOwner=new HouseOwner("张三",mediator);
        //中介者要知道具体的房主和租房者
        mediator.setTenant(tenant);
        mediator.setHouseOwner(houseOwner);
        tenant.contact("我要租三室的房子!!!");
        houseOwner.contact("我这里有三室的房子,你要租吗?");
    }
}

在这里插入图片描述

好处:

  • 松散耦合。中介者模式通过把多个同事对象之间的交互封装到中介者对象里面,从而使得同事对象之间松散耦合,基本上可以做到互补依赖。这样一来,同事对象就可以独立地变化和复用,而不再像以前那样“牵一处而动全身”了。
  • 集中控制交互。多个同事对象的交互,被封装在中介者对象里面集中管理,使得这些交互行为发生变化的时候,只需要修改中介者对象就可以了,当然如果是已经做好的系统,那么就扩展中介者对象,而各个同事类不需要做修改。
  • 一对多关联转变为一对一的关联。没有使用中介者模式的时候,同事对象之间的关系通常是一对多的,引入中介者对象以后,中介者对象和同事对象的关系通常变成双向的一对一,这会让对象的关系更容易理解和实现。

缺点:

  • 当同事类太多时,中介者的职责将很大,它会变得复杂而庞大,以至于系统难以维护。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值