设计模式(17)——中介者模式

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

前段时间要租房子,不可避免的要跟中介打交道,不用中介的话,就要直接找一房东,首先不好找房东,一个房东就一个房子,这个不满意就要找下一个房东,麻烦,而且房东找的也不容易,不如全部委托给房产中介,付点中介费省事。于是就从一(我自己作为一个租客)对多(多个房子的房东)变为了一(我)对一(中介),就省事很多了,我只要告诉中介我有什么需求,他马上就把合适的房源告诉我,然后我去看房。对于房东来说也是如此,一般不可能出现来一个租客就直接拍定说要租这个房子了,要经过好几个租客看房,确实很麻烦,把事情委托给房产中介就很省事了,也是从一对多变成了一对一。这其实就是中介者模式。

先定义一个中介者

interface Mediator
{
    void Register(Customer customer); //客户注册
    void Relay(Customer customer); //转发
}

再定义一个租客跟房东,他们对于中介都是乙方,因此定义一个抽象类,抽象接收消息和发送消息的方法

abstract class Customer
{
    protected Mediator mediator;
    public abstract void Receive();
    public abstract void Send();
    public void SetMediator(Mediator mediator)
    {
        this.mediator = mediator;
    }
}

实现中介者接口

class MyMediator : Mediator
{
    private List<Customer> customers = new List<Customer>();

    public void Register(Customer customer)
    {
        if (!customers.Contains(customer))
        {
            customers.Add(customer);
            customer.SetMediator(this);
        }
    }

    public void Relay(Customer customer)
    {
        foreach (Customer ob in customers)
        {
            if (!ob.Equals(customer))
            {
                ob.Receive();
            }
        }
    }
}

定义租客跟房东的实体类

class Tenant : Customer
{
    public override void Receive()
    {
        Console.WriteLine("租客收到消息");
    }

    public override void Send()
    {
        Console.WriteLine("租客发出消息");
        mediator.Relay(this); //请中介者转发
    }
}
class HouseOwner : Customer
{
    public override void Receive()
    {
        Console.WriteLine("房东收到消息");
    }

    public override void Send()
    {
        Console.WriteLine("房东发出消息");
        mediator.Relay(this); //请中介者转发
    }
}

调用

class Program
{
    static void Main(string[] args)
    {
        Mediator mediator = new MyMediator();
        Customer tenant = new Tenant();
        Customer houseOwner = new HouseOwner();
        mediator.Register(tenant);
        mediator.Register(houseOwner);
        tenant.Send();
        Console.WriteLine("-------------");
        houseOwner.Send();
        Console.Read();
    }
}

结果

租客发出消息
房东收到消息
-------------
房东发出消息
租客收到消息

类图

在这里插入图片描述

与观察者模式的区别

跟观察者模式其实有点相似,但其实本质是不同的。

  • 中介者模式涉及两个概念,中介和客户。它解决的是客户之间消息传递的问题。
  • 观察者模式也涉及两个概念,被观察者和观察者。它解决的是被观察者和众多观察者之间通信的问题,而不是目标之间通信的问题。观察者的场景类似于,手机应用给顾客推送消息。注意:这里的手机应用是被观察者,顾客是观察者。

优点与缺点

中介者模式的优点:

  • 简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,将各个同事类解耦,使得系统变为松耦合。
  • 提供系统的灵活性,使得各个同事对象独立而易于复用。

中介者模式的缺点:

  • 中介者模式中,中介者角色承担了较多的责任,所以一旦这个中介者对象出现了问题,整个系统将会受到重大的影响。例如,QQ游戏中计算欢乐豆的程序出错了,这样会造成重大的影响。
  • 新增加一个同事类时,不得不去修改抽象中介者类和具体中介者类,此时可以使用观察者模式和状态模式来解决这个问题。

本文主要借鉴了《Gof设计模式》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值