通俗易懂设计模式解析——中介者模式

前言

  今天我们一起看看中介者模式,怎么去理解这个模式呢?说起来也简单、好理解。生活中我们租房经常都是通过中介来实现的。一般租房要么是房东直租要么是中介。那么今天要讲的中介者模式和租房的这个中介是否有关系呢?当然是有点关系的。中介者模式是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,这个类就来处理不同类之间的通讯。租房中介也是这个道理。复制与各个房东和租户之间的通讯。将多对多简化成了一对多的关系。我们下面来具体看看到底是怎么回事吧!

中介者模式介绍

一、来由

在软件系统中经常会遇到多个对象相互关联相互引用依赖的情况。这样的话,如果遇到了需求变动将会影响到其他各个相互关联的对象变化。在这种情况下,就需要一个中介对象来管理处理这些多个对象之间的管理依赖关系。解决紧耦合、抵御一动牵全身的变化。

二、意图

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

三、案例图

四、中介者模式代码示例

看上面的案例图,我们一起看看包含的四个部分:

抽象中介者:定义了各个同事之间交互需要的方法。

具体中介者:需要了解维护各个同事对象,并且负责协调各个具体同事之间的交互。

抽象同事类:约束具体同事类的类型、并且实现一些具体同事类之间的公共方法。

具体同事类:实现自己的业务。

我们还是回到开篇讲到的那个例子。关于租房中介的例子。加入没有租房中介。这里有六个房东需要出租房屋,房屋各不相同、各有各的特点、适合不一样的人租住。这六个房东之间刚好有点联系。然后都在出租房屋。这时租客A来租房,看了一号房东的房子不满意、但是一号房东觉得可以让他去看看其他五个朋友的房间。然后开始联系他的五个朋友。这样运行下去好像有是没有什么问题的。但是其中二号房东如果房屋不出租或者出租出去了。也就是发生了变化。这是他则需要通知其他五个朋友,告诉他们不用再给他介绍租客了。这里就造成了中间一个人发生了变化,需要改动其他五个人。那么如何可以解决这种情况呢。我们回到现在。把中介加进来、那六个房东都把房屋交给中介处理。租客A看房间一不满意直接通过中介看房间二。当房间二被出租了。中介也只需要通知房东二号、然后他们签订合同。下次还有人看房间就不会再看房间二了。这里一个出现了变化也就影响改变了一个。并不会影响其他另外五个房东。这个例子可以更好的帮助我们理解中介者模式。我们下面看两幅图。

图一:不采用中介的房东租房模式,多对多的网格。一动牵全身

图二:采用中介的租房模式,一对多、一个变动不影响其他

下面我们看看代码如何实现中介者模式的吧。

namespace Mediator_Pattern
{class MediatorPattern
    {
    }/// <summary>/// 抽象中介者/// </summary>public abstract class Mediator
    {/// <summary>/// 定义与同事间的交互通信 /// </summary>public abstract void Common(string type);
    }/// <summary>/// 抽象同事类/// </summary>public abstract class Colleague
    {         /// <summary>/// 处理自己的事务(房东展示自己的房屋)/// </summary>public abstract void Handle();

    }/// <summary>/// 房屋中介/// </summary>public class HouseMediator : Mediator
    {/// <summary>/// 中介有所有房东的房屋信息/// </summary>private SmallHouseColleague SmallHouse;private TwoHouseColleague TwoHouse;private ThreeHouseColleague ThreeHouse;public void SetSmallHouse(SmallHouseColleague small)
        {
            SmallHouse = small;
        }public void SetTwoHouse(TwoHouseColleague two)
        {
            TwoHouse = two;
        }public void SetThreeHouse(ThreeHouseColleague three)
        {
            ThreeHouse = three;
        }/// <summary>///  /// </summary>/// <param name="colleague"></param>public override void Common(string  type)
        { switch (type)
            {case "单间":
                    SmallHouse.Handle();
                    Console.WriteLine("如果可以就可以租房了!");break;case "两居室":
                    TwoHouse.Handle();
                    Console.WriteLine("如果可以就可以租房了!");break;case "三居室":
                    ThreeHouse.Handle();
                    Console.WriteLine("如果可以就可以租房了!");break;default:
                    Console.WriteLine($"{type}暂时没有房源!");break;
            }
        }
    }/// <summary>/// 房东(小房间)/// </summary>public class SmallHouseColleague : Colleague
    {         /// <summary>/// 展示单间/// </summary>public override void Handle()
        {
            Console.WriteLine( "单间——便宜整洁");
        }
    }/// <summary>/// 房东(两居室)/// </summary>public class TwoHouseColleague : Colleague
    { /// <summary>/// 展示两居室/// </summary>public override void Handle()
        {
            Console.WriteLine("两居室——合适,靠谱");
        }
    }/// <summary>/// 房东(三居室)/// </summary>public class ThreeHouseColleague : Colleague
    { /// <summary>/// 展示三居室/// </summary>public override void Handle()
        {
            Console.WriteLine("三居室——大气,宽松");
        }
    }
}
namespace Mediator_Pattern
{class Program
    {static void Main(string[] args)
        {
            Console.WriteLine("一个租客看房:");///初始化中介HouseMediator mediator = new HouseMediator();///初始化房屋信息SmallHouseColleague smallHouseColleague = new SmallHouseColleague( );
            TwoHouseColleague twoHouseColleague = new TwoHouseColleague( );
            ThreeHouseColleague threeHouseColleague = new ThreeHouseColleague( );///中介获取房屋信息            mediator.SetSmallHouse(smallHouseColleague);
            mediator.SetTwoHouse(twoHouseColleague);
            mediator.SetThreeHouse(threeHouseColleague); ///租户A需要两居室、提供看房mediator.Common("两居室");//租户B需要四居室、暂无房源mediator.Common("四居室");

        }
    }
}

使用场景及优缺点

一、使用场景

1、系统中对象间存在较为复杂引用,导致依赖关系和结构混乱而无法复用的情况。

2、想通过一个中间类来封装多个类的行为,但是又不想要太多的子类。

二、优点

1、松散耦合、将多个对象之间的联系紧耦合封装到中介对象中,做到松耦合。不会导致一动牵全身。

2、将多个对象之间的交互联系集中在中介对象中。发送变化仅需修改中介对象即可、提供系统的灵活性、使同事对象独立而易于复用。

3、符合迪米特原则。就是说一个对象应当对其他对象有尽可能少的了解。减少各个对象之间的了解。

三、缺点

1、如果各个同事间的交互非常多并且复杂情况下,都交给中介者会导致中介者变得十分复杂,不易维护和管理。

总结

  到这里中介者模式就介绍完了。中介者模式主要是实现将多个对象的相互依赖和关联解耦。用中介对象封装一些列的对象交互。将多对多的相互转换为多对一的相互作用。我们再回忆我们之前所讲到的外观模式和代理模式。好像三者之间有一些相似之处。那么我们如何区分这三种模式呢?首先我们看外观模式—外观模式注重的是简化接口,简化组件系统与外部程序的依赖关系。提供一个更高层次的统一接口,使子系统更加简便的使用。代理模式—注重的是对其他对象的访问控制、倾向于的是一对一的关系处理。中介者模式—注重的是将多对多的关系处理封装到一对多、通过一个中介者对象对多个对象之间的依赖进行解耦。

(0)

相关推荐

  • 行为型模式之中介者模式

    在现实生活中,常常会出现好多对象之间存在复杂的交互关系,这种交互关系常常是"网状结构",它要求每个对象都必须知道它需要交互的对象. 如果把这种"网状结构"改为& ...

  • Java设计模式-中介者模式

    https://www.shengchulai.com/blog-CiTs5E8tUf.htm 前言 小时候钟爱战争片,<地道战>.<鸡毛信>.<铁道游击队>一系列 ...

  • MediatorPattern中介者模式

    中介者模式 1.定义 使用一个中介对象封装一系列的对象交互,中介者使用对象不需要显式的相互作用,从而实降现低耦合度,且可以独立改变被封装的一些列对象之间的交互. 中介者模式也叫做调停者模式:对象之间的 ...

  • 设计模式------中介者模式

    中介者模式: 定义一个对象来封装一系列对象的交互. 中介者的四个角色: 1.Mediator(抽象中介者) 2.ConcreteMediator(具体中介者) 3.Colleague(抽象同事类) 4 ...

  • 图解Java设计模式之中介者模式

    智能家庭项目 传统方案解决智能家庭管理问题 中介者模式基本介绍 中介者模式的原理类图 中介者模式 - 智能家庭的操作流程 中介者模式的注意事项和细节 智能家庭项目 1)智能家庭包括各种设备,闹钟.咖啡 ...

  • PHP设计模式之中介者模式

    PHP设计模式之中介者模式 上回说道,我们在外打工的经常会和一类人有很深的接触,那就是房产中介.大学毕业后马上就能在喜欢的城市买到房子的X二代不在我们的考虑范围内哈.既然需要长期的租房,那么因为工作或 ...

  • 通俗易懂设计模式解析——解释器模式

    前言 今天我们来讲解释器模式[Interpreter Pattern],如何理解这一个模式呢?一个简单的例子.中英文翻译器这个东西的作用是啥呢?将不知道的英文翻译成中文以便于理解.或者把中文翻译成英文 ...

  • [PHP小课堂]PHP设计模式之中介者模式

    [PHP小课堂]PHP设计模式之中介者模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 无废话设计模式(17)行为型模式--中介者模式

    0-前言 中介者模式定义(Mediator): 用一个中介对象来封装一系列的对象交互. 中介者对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互. 1-实现 1-1.简单UM ...

  • 设计模式-行为型-中介者模式

    中介者模式(Mediator): 在现实生活中,有很多中介者模式的身影,例如QQ游戏平台,聊天室.QQ群.短信平台和房产中介.不论是QQ游戏还是QQ群,它们都是充当一个中间平台,QQ用户可以登录这个中 ...

  • 简说设计模式——中介者模式

    一.什么是中介者模式 中介这个词并不陌生,就是房屋中介的那个"中介",就是中间人的意思.比如MVC模式,C(Controller控制器)是M(Model模型)和V(View视图)的 ...