深入Java设计模式之中介模式

简介: 深入Java设计模式之中介模式

什么是中介者模式

用一个中介对象封装一系列的对象 交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它 们之间的交互,减少类之间的依赖

中介者模式适用场景

在以下情况下可以考虑使用中介者模式:

  • 系统中对象之间存在复杂的引用关系,系统结构混乱且难以理解。
  • 一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象。
  • 通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。可以通过引入中介者类来实现,在中介者中定义对象交互的公共行为,如果需要改变行为则可以增加新的具体 中介者类

中介者模式的分类

标准中介者

 

package com.lzhsite.technology.designPattern.mediator.ComputerDemo;
/**
 * 期望实现的效果:驱动执行完之后执行cpu,cpu执行完之后执行声音和音频
 * @author lzhcode
 *
 */
public class ClientForComputerDemo
{
    public static void main(String[] args)
    {
        MainBoard mainBoard = new MainBoard();
        CDDriver cdDriver = new CDDriver(mainBoard);
        CPU cpu = new CPU(mainBoard);
        VideoCard videoCard = new VideoCard(mainBoard);
        SoundCard soundCard = new SoundCard(mainBoard);
        mainBoard.setCdDriver(cdDriver);
        mainBoard.setCpu(cpu);
        mainBoard.setVideoCard(videoCard);
        mainBoard.setSoundCard(soundCard);
        cdDriver.readCD();
    }
}
package com.lzhsite.technology.designPattern.mediator.ComputerDemo;
public interface Mediator
{
  /**
   * 同事对象在自身发生改变的时候,通知中介者的方法
   * 让中介者去负责相应同事的交互
   * 同事对象在自身,好让中介者对象实例去获取同事对象的状态
   * @param colleague
   */
    public void changed(Colleague colleague);
}
package com.lzhsite.technology.designPattern.mediator.ComputerDemo;
/***
 * 相当于中介类
 **/
public class MainBoard implements Mediator
{
    protected CPU cpu;
    private CDDriver cdDriver;
    private VideoCard videoCard;
    private SoundCard soundCard;
    public void setCdDriver(CDDriver cdDriver)
    {
        this.cdDriver = cdDriver;
    }
    public void setCpu(CPU cpu)
    {
        this.cpu = cpu;
    }
    public void setVideoCard(VideoCard videoCard)
    {
        this.videoCard = videoCard;
    }
    public void setSoundCard(SoundCard soundCard)
    {
        this.soundCard = soundCard;
    }
    public void changed(Colleague colleague)
    {
        if (colleague == cdDriver)
        {
            this.operateCDDriverReadData((CDDriver) colleague);
        } else if (colleague == cpu)
        {
            this.operateCPU((CPU) colleague);
        }
    }
    public void operateCDDriverReadData(CDDriver cdDriver)
    {
        String data = cdDriver.getData();
        this.cpu.executeData(data);
    }
    public void operateCPU(CPU cpu)
    {
        String videoData = cpu.getVideoData();
        String soundData = cpu.getSoundData();
        this.videoCard.showData(videoData);
        this.soundCard.soundData(soundData);
    }
}
package com.lzhsite.technology.designPattern.mediator.ComputerDemo;
public abstract class Colleague
{
    private final Mediator mediator;
    protected Colleague(Mediator mediator)
    {
        this.mediator = mediator;
    }
    public Mediator getMediator()
    {
        return mediator;
    }
}
package com.lzhsite.technology.designPattern.mediator.ComputerDemo;
public class CPU extends Colleague
{
    private String videoData;
    private String soundData;
    protected CPU(Mediator mediator)
    {
        super(mediator);
    }
    public String getVideoData()
    {
        return videoData;
    }
    public String getSoundData()
    {
        return soundData;
    }
    public void executeData(String data)
    {
        String[] ss = data.split(",");
        this.videoData = ss[0];
        this.soundData = ss[1];
        this.getMediator().changed(this);
    }
}
package com.lzhsite.technology.designPattern.mediator.ComputerDemo;
public class SoundCard extends Colleague
{
    protected SoundCard(Mediator mediator)
    {
        super(mediator);
    }
    public void soundData(String data)
    {
        System.out.println("画外音:" + data);
    }
}
package com.lzhsite.technology.designPattern.mediator.ComputerDemo;
public class VideoCard extends Colleague
{
    protected VideoCard(Mediator mediator)
    {
        super(mediator);
    }
    public void showData(String data)
    {
        System.out.println("您正在观看的是:" + data);
    }
}
package com.lzhsite.technology.designPattern.mediator.ComputerDemo;
public class CDDriver extends Colleague {
  private String data;
  protected CDDriver(Mediator mediator) {
    super(mediator);
  }
  public String getData() {
    return data;
  }
  public void readCD() {
    this.data = "Video Data, Sound Data";
    this.getMediator().changed(this);
  }
}

广义中介者

package com.lzhsite.technology.designPattern.mediator.ColleagueDemo;
public class ClientForColleagueDemo
{
    public static void main(String[] args)
    {
        AbstractMediator mediator = new Mediator();
        ColleagueA colleagueA = new ColleagueA();
        ColleagueB colleagueB = new ColleagueB();
        mediator.addColleague("ColleagueA", colleagueA);
        mediator.addColleague("ColleagueB", colleagueB);
        colleagueA.self();
        colleagueA.out();
        System.out.println("合作愉快,任务完成");
        System.out.println();
        colleagueB.self();
        colleagueB.out();
        System.out.println("合作愉快,任务完成");
    }
}
package com.lzhsite.technology.designPattern.mediator.ColleagueDemo;
public class AbstractColleague
{
    protected AbstractMediator mediator;
    public void setMediator(AbstractMediator mediator)
    {
        this.mediator = mediator;
    }
}
package com.lzhsite.technology.designPattern.mediator.ColleagueDemo;
import java.util.Hashtable;
public abstract class AbstractMediator
{
    protected Hashtable<String, AbstractColleague> colleagues = new Hashtable<String, AbstractColleague>();
    public void addColleague(String name, AbstractColleague colleague)
    {
      //在这里把自己注册进中介mediator,与其取得联系
        colleague.setMediator(this);
        this.colleagues.put(name, colleague);
    }
    public void deleteColleague(String name)
    {
        this.colleagues.remove(name);
    }
    public abstract void execute(String name, String method);
}
package com.lzhsite.technology.designPattern.mediator.ColleagueDemo;
public class Mediator extends AbstractMediator {
  public void execute(String name, String method) {
    if ("self".equals(method)) {
      if ("ColleagueA".equals(name)) {
        ColleagueA colleagueA = (ColleagueA) super.colleagues.get("ColleagueA");
        colleagueA.self();
      } else {
        ColleagueB colleagueB = (ColleagueB) super.colleagues.get("ColleagueB");
        colleagueB.self();
      }
    } else {
      if ("ColleagueA".equals(name)) {
        ColleagueA colleagueA = (ColleagueA) super.colleagues.get("ColleagueA");
        colleagueA.out();
      } else {
        ColleagueB colleagueB = (ColleagueB) super.colleagues.get("ColleagueB");
        colleagueB.out();
      }
    }
  }
}
package com.lzhsite.technology.designPattern.mediator.ColleagueDemo;
public class ColleagueA extends AbstractColleague
{
    public void self()
    {
        System.out.println("同事A --> 做好自己份内的事情...");
    }
    public void out()
    {
        System.out.println("同事A --> 请求同事B 做好份内的事情");
        super.mediator.execute("ColleagueB", "self");
    }
}
package com.lzhsite.technology.designPattern.mediator.ColleagueDemo;
public class ColleagueB extends AbstractColleague
{
    public void self()
    {
        System.out.println("同事B --> 做好自己份内的事情...");
    }
    public void out()
    {
        System.out.println("同事B --> 请求同事A 做好份内的事情");
        super.mediator.execute("ColleagueA", "self");
    }
}

示例代码:https://gitee.com/lzhcode/maven-parent/tree/master/lzh-technology/src/main/java/com/lzhsite/technology/designPattern/mediator


相关文章
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
1天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
6天前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
18 0
[Java]23种设计模式
|
17天前
|
设计模式 Java Kotlin
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。对于快速学习Kotlin语法,推荐查看“简洁”系列教程。本文重点介绍了构建者模式在Kotlin中的应用与改良,包括如何使用具名可选参数简化复杂对象的创建过程,以及如何在初始化代码块中对参数进行约束和校验。
16 3
|
22天前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
2月前
|
存储 设计模式 安全
Java设计模式-备忘录模式(23)
Java设计模式-备忘录模式(23)
|
2月前
|
设计模式 存储 缓存
Java设计模式 - 解释器模式(24)
Java设计模式 - 解释器模式(24)
|
19天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
31 0
|
22天前
|
设计模式 Java
Java设计模式
Java设计模式
24 0
|
25天前
|
设计模式 Java
Java设计模式之外观模式
这篇文章详细解释了Java设计模式之外观模式的原理及其应用场景,并通过具体代码示例展示了如何通过外观模式简化子系统的使用。
26 0