设计模式--中介者模式

中介者模式

核心:如果一个系统中对象之间的联系呈现为网状结构,对象之间存在大量多对多关系,将导致关系及其复杂,这些对象称为“同事对象”,这时可以引入一个中介者对象,使各个同时对象只跟中介者对象打交道。

本质:解耦多个同事对象之间的交互关系,每个对象都持有中介者对象的引用,只跟中介者对象打交道。我们通过中介者对象统一管理这些交互关系。

角色

1)         抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法

2)         具体中介者(ConcreteMediator)角色:实现中介者接口,定义了一个List来管理同事对象,协调各个同事角色之间的互交关系

3)         抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。

4)         具体同事类(ConcreteColleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。

图示:设计模式--中介者模式_第1张图片

 

 

package com.offcn.designpattern.mediatorpattern;

import java.util.HashMap;
import java.util.Map;

public class mediatorpatternDemo {
    public static void main(String[] args) {
        Mediator mediator = new ConcreteMediator();
        ConcreteDepartment1 c1= new ConcreteDepartment1(mediator);
        ConcreteDepartment2 c2 = new ConcreteDepartment2(mediator);
        c1.selfAction();
        c2.outAction();
        mediator.command("department1");
    }
}
//抽象中介者
interface Mediator{
    //注册
    void register(String dname,Department d);
    //给同事发任务
    void command(String dname);
}
//具体中介者,经理
class ConcreteMediator implements Mediator{
    private Map map = new HashMap<>();
    @Override
    public void register(String dname, Department d) {
        map.put(dname,d);
    }

    @Override
    public void command(String dname) {
        map.get(dname).selfAction();//本部门任务
    }
}
//同事接口
interface Department{
    void selfAction();//做本部门任务
    void outAction();//向经理发出申请
}
//具体同事1
class ConcreteDepartment1 implements Department{
    private Mediator m;//持有中介者

    public ConcreteDepartment1(Mediator m) {
        this.m = m;
        //注册
        m.register("department1",this);
    }

    @Override
    public void selfAction() {
        System.out.println("做自己的研发工作");
    }

    @Override
    public void outAction() {
        System.out.println("汇报研发工作进展");

    }
}
//具体同事1
class ConcreteDepartment2 implements Department{
    private Mediator m;//持有中介者

    public ConcreteDepartment2(Mediator m) {
        this.m = m;
        //注册
        m.register("department2",this);
    }

    @Override
    public void selfAction() {
        System.out.println("做自己的会计工作");
    }

    @Override
    public void outAction() {
        System.out.println("汇报公司开支情况");

    }
}

输出:

设计模式--中介者模式_第2张图片

优点

1)降低了对象之间的耦合性,使得对象易于独立地被复用。

2)将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。

缺点

当同事类太多时,中介者的职责将很大,它会变得复杂而庞大,以至于系统难以维护。

实用场景

1)         MVC模式其中的C,控制器就是一个中介者对象,M和V都和他打交道

2)         窗口游戏程序,窗口软件开发中窗口对象也是一个中介者对象

3)         图形界面开发GUI中,多个组件之间的交互,可以通过引入一个中介者对象来解决,可以是整体的窗口对象或者DOM对象

 

你可能感兴趣的:(设计模式--中介者模式)