二十三种设计模式[17] - 中介者模式(Mediator Pattern)

前言

在开发软件的过程中,我们通常会将类设计的比较单纯,使其复用性更高。但类间的相互引用又使得类本身在没有其他类的支持下不能正常工作,导致其复用性降低。所以为了提高类的复用性我们需要尽可能的减少对其它类的引用,也就是说我们常说的解耦。中介者模式,顾名思义,就是存在一个类似中介的角色,类与类之间不直接交互而是通过中介进行间接的交互,也就意味着类与类之间不需要存在显示的引用,以达到松耦合的目的。

中介者模式,对象行为型模式的一种。在《设计模式 - 可复用的面向对象软件》一书中将之描述为“ 用一个中介对象来封装一些列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互 ”。

结构

  • Mediator(抽象中介者):用来定义各同事对象间的交互,只有一个实现时无存在意义;
  • ConcreteMediator(具体中介者):实现中介者接口,保留各个同事对象的引用并实现各同事对象间的业务交互;
  • Colleague(抽象同事类):所有具体同事类的公共接口,可有可无(因为无法保证所有同事类都存在某些函数)
  • ConcreteColleague(具体同事类):具体的业务对象,只实现了本身关心的业务并且保留了中介者的引用,通过中介者与其它业务对象交互;

示例

public class ColleagueA
{
    private Mediator MediatorObj { set; get; }

    public ColleagueA(Mediator mediator)
    {
        this.MediatorObj = mediator;
    }

    public void OperationA()
    {
        Console.WriteLine("ConcreteColleagueA.Operation");
    }

    public void OperationB()
    {
        Console.Write("[ConcreteColleagueA]:");

        if (this.MediatorObj != null)
        {
            this.MediatorObj.OperationB();
        }
    }
}

public class ColleagueB
{
    private Mediator MediatorObj { set; get; }

    public ColleagueB(Mediator mediator)
    {
        this.MediatorObj = mediator;
    }

    public void OperationA()
    {
        Console.Write("[ConcreteColleagueB]:");

        if (this.MediatorObj != null)
        {
            this.MediatorObj.OperationA();
        }
    }

    public void OperationB()
    {
        Console.WriteLine("ConcreteColleagueB.Operation");
    }
}

public class ColleagueC
{
    public void Operation()
    {
        Console.WriteLine("ConcreteColleagueC.Operation");
    }
}

public class ColleagueD
{
    private Mediator MediatorObj { set; get; }

    public ColleagueD(Mediator mediator)
    {
        this.MediatorObj = mediator;
    }

    public void Operation()
    {
        Console.Write("[ConcreteColleagueD]:");

        if (this.MediatorObj != null)
        {
            this.MediatorObj.OperationC();
        }
    }
}

public class Mediator
{
    public ColleagueA ColleagueAObj { set; private get; }
    public ColleagueB ColleagueBObj { set; private get; }
    public ColleagueC ColleagueCObj { set; private get; }

    public void OperationA()
    {
        if(this.ColleagueAObj != null)
        {
            this.ColleagueAObj.OperationA();
        }
    }

    public void OperationB()
    {
        if (this.ColleagueBObj != null)
        {
            this.ColleagueBObj.OperationB();
        }
    }

    public void OperationC()
    {
        if (this.ColleagueCObj != null)
        {
            this.ColleagueCObj.Operation();
        }
    }
}

static void Main(string[] args)
{
    Mediator.Mediator mediator = new Mediator.Mediator();
    ColleagueA colleagueA = new ColleagueA(mediator);
    ColleagueB colleagueB = new ColleagueB(mediator);
    ColleagueC colleagueC = new ColleagueC();
    ColleagueD colleagueD = new ColleagueD(mediator);

    mediator.ColleagueAObj = colleagueA;
    mediator.ColleagueBObj = colleagueB;
    mediator.ColleagueCObj = colleagueC;

    colleagueA.OperationB();
    colleagueB.OperationA();
    colleagueD.Operation();
    Console.ReadKey();
}

补充

  • 中介者模式在MVC中的应用

我们都知道在MVC(Model-模型,View-视图,Controller-控制器)中一个视图的展示需要一个或多个模型的支撑,但模型与视图并不直接交互,而是通过控制器间接交互,也就是说在MVC中,控制器充当的就是一个中介者角色。

  • 中介者模式与外观模式

中介者模式与外观模式(Facade Pattern)比较相似,比如它们都是通过一个中间类去调用其它类。但外观模式是单向的,即Facade向子系统中的类发出请求而该类则不能向Facade发出请求,并且外观模式的核心在于将一个系统对外提供的操作封装到一个类中,使用户使用起来更加方便。而中介者模式的核心目的在于将类与其依赖类解耦,并且它的调用是双向的,Colleague既可以向Mediator发出请求,Mediator也可以向Colleague发出请求。

总结

中介者模式能够帮助我们提高类的复用性,当类与其它类的交互业务改变时只需要增加新的中介者即可,复合开闭原则。一个类将其与外界的交互逻辑封装到中介者时能够使它们更加单纯,即类只关心自身的业务实现而中介者只需要关心各业务的交互即可,复合迪米特原则。由于中介者封装了类与类的交互逻辑,也使得它变得非常复杂难以维护。

以上,就是我对中介者模式的理解,希望对你有所帮助。

示例源码:https://gitee.com/wxingChen/DesignPatternsPractice

系列汇总:https://www.cnblogs.com/wxingchen/p/10031592.html

本文著作权归本人所有,如需转载请标明本文链接(https://www.cnblogs.com/wxingchen/p/10090551.html)

原文地址:https://www.cnblogs.com/wxingchen/p/10090551.html

时间: 2024-08-06 03:17:41

二十三种设计模式[17] - 中介者模式(Mediator Pattern)的相关文章

二十三种设计模式——工厂模式

二十三种设计模式--工厂模式 简单工厂模式 简单工厂模式又称静态工厂方法(StaticFactory Method)模式,不属于23种模式之一. 简单工厂模式是工厂模式最简单使用的模式. 类图: 程序: #include <iostream> #include<string> using namespace std; class NationalFlag//父类 { public: NationalFlag(){} ~NationalFlag(){} virtual void di

设计模式之中介者模式(Mediator)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

二十三种设计模式及其python实现

本文源码寄方于github:https://github.com/w392807287/Design_pattern_of_python 参考文献: <大话设计模式>——吴强 <Python设计模式>——pythontip.com <23种设计模式>——http://www.cnblogs.com/beijiguangyong/ 设计模式是什么? 设计模式是经过总结.优化的,对我们经常会碰到的一些编程问题的可重用解决方案.一个设计模式并不像一个类或一个库那样能够直接作用

23种设计模式--中介者模式-Mediator Pattern

一.中介者模式的介绍     中介者模式第一下想到的就是中介,房子中介,婚姻中介啊等等,当然笔者也希望来个婚姻中介给我介绍一个哈哈哈,,回归正题中介者模式分成中介者类和用户类,根据接口编程的方式我们再把中介和用户类分成2个类,这样就成了抽象中介者角色,具体中介者角色.抽象同事类和具体同事类.来几个例子比如说各种游戏平台,还有我们最熟悉的QQ平台,等等这些都是中介者模式的具体应用,中介者模式常用于处理通信之间复杂有关联的业务,这样就会存在一个缺点比如说因为中介者处理了好多用户之间的关系,一但发生错

23种设计模式之中介者模式(Mediator)

中介者模式是一种对象的行为型模式,通过一个中介对象来封装一系列的对象交互.中介者使得各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.中介者对象的存在保证了对象结构上的稳定,也就是说,系统的结构不会因为新对象的引入带来大量的修改工作. 优点: 1)去除对象间的影响. 2)简化了对象间协议. 3)集中化了控制. 4)由于不再需要直接互传消息,单个组件变得更加简单,而且容易处理. 5)由于不再需要包含逻辑来处理组件间的通信,组件变得更加适用. 适用场景: 1)对象集合需

二十三种设计模式 罗列

1.工厂方法模式(Factory Method) 2.抽象工厂模式(Abstract Factory) 3.单例模式(Singleton) 4.建造者模式(Builder) 5.原型模式(ProtoType) 6.适配器模式(Adapter) 7.装饰模式(Decorator) 8.代理模式(Proxy) 9.外观模式(Facade) 10.桥接模式(Bridge) 11.组合模式(Composite) 12.享元模式(FlyWeight) 13.策略模式(Strategy) 14.模板方法模式

java实现23种设计模式之中介者模式

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护. package com.ceshi21; public interface Mediator { public void createMediator(); public void workAll(); } package com.ceshi21; public abstract class User { private M

二十四种设计模式:享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern) 介绍运用共享技术有效地支持大量细粒度的对象. 示例有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要运用共享技术支持这些对象. MessageModel using System; using System.Collections.Generic; using System.Text; namespace Pattern.Flyweight { /// <summary> /// Message实体类 ///

大熊君说说JS与设计模式之------中介者模式Mediator

一,总体概要 1,笔者浅谈 我们从日常的生活中打个简单的比方,我们去房屋中介租房,房屋中介人在租房者和房东出租者之间形成一条中介.租房者并不关心他租谁的房.房东出租者也不关心他租给谁.因为有中介的存在,这场交易才变得如此方便. 在软件的开发过程中,势必会碰到这样一种情况,多个类或多个子系统相互交互,而且交互很繁琐,导致每个类都必须知道他需要交互的类,这样它们的耦合会显得异常厉害.牵一发而动全身,后果很严重,大熊很生气!~~~~(>_<)~~~~  好了,既然问题提出来了,那有请我们这期的主角-