当前位置: 移动技术网 > IT编程>开发语言>Java > 中介者模式(Mediator Pattern)

中介者模式(Mediator Pattern)

2018年12月19日  | 移动技术网IT编程  | 我要评论
中介者模式 一、概述   中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。 二、介绍   用一个中介对象来封装 ...

中介者模式

一、概述

  中介者模式(mediator pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。

二、介绍

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

  中介者模式将多个类相互耦合,形成的网状结构,分离为星型结构。

关键代码:对象 colleague 之间的通信封装到一个类中单独处理。
它主要包含如下几个角色:

  • mediator: 抽象中介者。定义了同事对象到中介者对象之间的接口。
  • concretemediator: 具体中介者。实现抽象中介者的方法,它需要知道所有的具体同事类,同时需要从具体的同事类那里接收信息,并且向具体的同事类发送信息。
  • colleague: 抽象同事类。
  • concretecolleague: 具体同事类。每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。

优点:

  1. 降低了类的复杂度,将一对多转化成了一对一。
  2. 各个类之间的解耦。
  3. 符合迪米特原则(一个对象应当对其他对象有尽可能少的了解)。

缺点:中介者会庞大,变得复杂难以维护。

使用场景:

  1. 系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
  2. 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

三、代码实现

抽象中介类

package com.designpattern.mediatorpattern;

/**
 * 抽象中介类
 *
 * @author zhongtao on 2018/12/19
 */
public abstract class mediator {

    public abstract void contact(string content, colleague colleague);
}

抽象同事类

package com.designpattern.mediatorpattern;

/**
 * 抽象同事类
 *
 * @author zhongtao on 2018/12/19
 */
public class colleague {

    protected string name;
    protected mediator mediator;

    public colleague(string name, mediator mediator) {
        this.name = name;
        this.mediator = mediator;
    }
}

具体同事类a和b

package com.designpattern.mediatorpattern;

/**
 * 具体同事类a
 *
 * @author zhongtao on 2018/12/19
 */
public class colleaguea extends colleague {
    public colleaguea(string name, mediator mediator) {
        super(name, mediator);
    }

    public void getmessage(string message) {
        system.out.println("同事a:" + name + " 获取信息:" + message);
    }

    public void contact(string message) {
        mediator.contact(message, this);
    }
}

/**
 * 具体同事类b
 *
 * @author zhongtao on 2018/12/19
 */
public class colleagueb extends colleague {
    public colleagueb(string name, mediator mediator) {
        super(name, mediator);
    }

    public void getmessage(string message) {
        system.out.println("同事b:" + name + " 获取信息:" + message);
    }

    public void contact(string message) {
        mediator.contact(message, this);
    }
}

具体中介类

package com.designpattern.mediatorpattern;

/**
 * 具体中介类
 *
 * @author zhongtao on 2018/12/19
 */
public class concretemediator extends mediator {

    private colleaguea colleaguea;
    private colleagueb colleagueb;

    public colleaguea getcolleaguea() {
        return colleaguea;
    }

    public void setcolleaguea(colleaguea colleaguea) {
        this.colleaguea = colleaguea;
    }

    public colleagueb getcolleagueb() {
        return colleagueb;
    }

    public void setcolleagueb(colleagueb colleagueb) {
        this.colleagueb = colleagueb;
    }

    @override
    public void contact(string content, colleague colleague) {
        if (colleague == colleaguea) {
            colleagueb.getmessage(content);
        } else {
            colleaguea.getmessage(content);
        }
    }
}

客户端 测试中介者模式

package com.designpattern.mediatorpattern;

/**
 * 客户端 测试中介者模式
 *
 * @author zhongtao on 2018/12/19
 */
public class client {

    public static void main(string[] args) {
        concretemediator mediator = new concretemediator();

        colleaguea peter = new colleaguea("peter", mediator);
        colleagueb lina = new colleagueb("lina", mediator);

        mediator.setcolleaguea(peter);
        mediator.setcolleagueb(lina);

        peter.contact("我是peter,想请lina晚上看电影");
        lina.contact("我是lina,可以滴");
    }
}

测试结果

同事b:lina 获取信息:我是peter,想请lina晚上看电影
同事a:peter 获取信息:我是lina,可以滴

源码地址:https://github.com/zt19994/designpattern

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网