GVKun编程网logo

中介模式Mediator(中介模式和代理模式的区别)

19

在本文中,我们将给您介绍关于中介模式Mediator的详细内容,并且为您解答中介模式和代理模式的区别的相关问题,此外,我们还将为您提供关于.Net行为型设计模式之中介者模式(Mediator)、23、

在本文中,我们将给您介绍关于中介模式Mediator的详细内容,并且为您解答中介模式和代理模式的区别的相关问题,此外,我们还将为您提供关于.Net行为型设计模式之中介者模式(Mediator)、23、行为型 - 中介者模式(Mediator)、C#设计模式之Mediator中介者模式解决程序员的七夕缘分问题示例、C#设计模式之十七中介者模式(Mediator Pattern)【行为型】的知识。

本文目录一览:

中介模式Mediator(中介模式和代理模式的区别)

中介模式Mediator(中介模式和代理模式的区别)

一 概述

中介,是作为多个事物之间充当交互沟通的媒介,在程序也是这样的,对象与对象之间不需要持有对方引用,而是通过中介相互连接;

二 使用示例

使用聊天室作为中介,支持用户登录、用户注销、用户发言;

package cn.hello;

/**
 * 聊天室里的用户
 *
 * @author:wjm
 * @date:2020/6/23 22:41
 */
public class User {

    /**
     * 用户名字
     */
    private String name;

    /**
     * 聊天室引用
     */
    private ChatRoom chatRoom;

    /**
     * 限制创建用户时必须起名字
     *
     * @param name
     */
    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    /**
     * 用户登陆
     *
     * @param chatRoom
     */
    public void login(ChatRoom chatRoom) {
        //连接到聊天室
        chatRoom.connect(this);
        //注入聊天室引用
        this.chatRoom = chatRoom;
    }

    /**
     * 用户注销
     *
     * @param chatRoom
     */
    public void logout(ChatRoom chatRoom) {
        //连接到聊天室
        chatRoom.disconnect(this);
        //销毁聊天室
        this.chatRoom = null;
    }

    /**
     * 用户发言
     *
     * @param msg
     */
    public void talk(String msg) {
        if (chatRoom == null) {
            System.out.println("用户" + this.name + "已退出,无法继续发言");
            return;
        }
        //给聊天室发消息(绑定了用户与信息)
        chatRoom.sendMsg(this, msg);
    }

    /**
     * 接收信息
     *
     * @param fromWhom
     * @param msg
     */
    public void receive(User fromWhom, String msg) {
        System.out.println("【" + this.name + "的对话框】" + fromWhom.getName() + " 说: " + msg);
    }
}
package cn.hello;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 聊天室
 *
 * @author:wjm
 * @date:2020/6/23 22:47
 */
public class ChatRoom {
    /**
     * 聊天室名字
     */
    private String name;

    /**
     * 聊天室里的用户们
     */
    List<User> userList = new ArrayList<>();

    /**
     * 限制创建聊天室时必须起名字
     *
     * @param name
     */
    public ChatRoom(String name) {
        this.name = name;
    }

    /**
     * 连接聊天室,用户加入
     *
     * @param user
     */
    public void connect(User user) {
        //将用户加入聊天室列表
        userList.add(user);
        System.out.println("欢迎【" + user.getName() + "】加入聊天室【" + this.name + "】");
    }

    /**
     * 离开聊天室,用户退出
     *
     * @param user
     */
    public void disconnect(User user) {
        //将用户从聊天室列表移出
        Iterator<User> iterator = userList.iterator();
        while (iterator.hasNext()) {
            User userInChatRoom = iterator.next();
            if (userInChatRoom == user) {
                iterator.remove();
            }
        }
        System.out.println("【" + user.getName() + "】离开聊天室【" + this.name + "】");
    }

    /**
     * 发送信息 给 聊天室里 除了发送方之外的 其他所有用户
     *
     * @param fromWhom
     * @param msg
     */
    public void sendMsg(User fromWhom, String msg) {
        userList.stream().filter(user ->
                //过滤掉发送方fromWhom
                !user.equals(fromWhom))
                //发送消息给剩下的所有人
                .forEach(toWhom -> toWhom.receive(fromWhom, msg));
    }
}
package cn.hello;

/**
 * 应用
 *
 * @author:wjm
 * @date:2020/6/23 22:56
 */
public class Test {
    public static void main(String[] args) {
        ChatRoom chatRoom = new ChatRoom("聊天室1");
        User user1 = new User("小明1");
        User user2 = new User("小明2");
        User user3 = new User("小明3");
        User user4 = new User("小明4");
        User user5 = new User("小明5");
        User user6 = new User("小明6");
        User user7 = new User("小明7");
        User user8 = new User("小明8");
        User user9 = new User("小明9");

        user1.login(chatRoom);
        user2.login(chatRoom);
        user3.login(chatRoom);
        user4.login(chatRoom);
        user5.login(chatRoom);
        user6.login(chatRoom);
        user7.login(chatRoom);
        user8.login(chatRoom);
        user9.login(chatRoom);

        System.out.println();

        user1.talk("大家好,我来了");

        System.out.println();

        user3.logout(chatRoom);
        user4.logout(chatRoom);
        user5.logout(chatRoom);
        user6.logout(chatRoom);
        user7.logout(chatRoom);
        user8.logout(chatRoom);
        user9.logout(chatRoom);

        System.out.println();

        //测试注销是否生效
        user3.talk("大家好,我来了");

        /*************************以下为输出************************/
        /*
        欢迎【小明1】加入聊天室【聊天室1】
        欢迎【小明2】加入聊天室【聊天室1】
        欢迎【小明3】加入聊天室【聊天室1】
        欢迎【小明4】加入聊天室【聊天室1】
        欢迎【小明5】加入聊天室【聊天室1】
        欢迎【小明6】加入聊天室【聊天室1】
        欢迎【小明7】加入聊天室【聊天室1】
        欢迎【小明8】加入聊天室【聊天室1】
        欢迎【小明9】加入聊天室【聊天室1】

        【小明2的对话框】小明1 说: 大家好,我来了
        【小明3的对话框】小明1 说: 大家好,我来了
        【小明4的对话框】小明1 说: 大家好,我来了
        【小明5的对话框】小明1 说: 大家好,我来了
        【小明6的对话框】小明1 说: 大家好,我来了
        【小明7的对话框】小明1 说: 大家好,我来了
        【小明8的对话框】小明1 说: 大家好,我来了
        【小明9的对话框】小明1 说: 大家好,我来了

        【小明3】离开聊天室【聊天室1】
        【小明4】离开聊天室【聊天室1】
        【小明5】离开聊天室【聊天室1】
        【小明6】离开聊天室【聊天室1】
        【小明7】离开聊天室【聊天室1】
        【小明8】离开聊天室【聊天室1】
        【小明9】离开聊天室【聊天室1】

         用户小明3已退出,无法继续发言
         */
    }
}

以上只是最简单的聊天室发言方式,如果需求变得复杂,例如有了不同的用户,或是聊天室也各不相同并加入了各自的特性,那我们就需要继续重构,抽象聊天室类,抽象用户类,读者可以灵活运用等;

三 总结

中介模式不止是在生活中广泛应用,在软件架构中也非常常见,如微服务分布式软件架构所用到的注册中心Eureka,其作用就是为众多分布式服务提供注册发现服务,它充当了像中介一样的角色;

组合模式属于树型结构:它主要描述的是子节点与父节点的关系:
组合模式树形结构
中介模式属于网络拓扑中的星型结构,它描述了众节点与中心点的关系:
中介模式星形结构

对像之间显式地互相引用越多,意味着依赖性越强,独立性越差,不利于代码维护与扩展,同时多方沟通的任务也应交由中间平台来完成,每个类应只具备各自该有的功能,这便是高内聚低耦合的设计标准;
中介模式符合迪米特法则,它解决了对象间过度耦合、复杂频繁交互的问题,打破了你中有我,我中有你的相互依赖,第三方的介入有助于双方调停,打破如胶似漆、纠缠不休的关系,让他们之间变得松散、自由、独立;

四 类UML图

中介模式

源码地址:我的GitHub

.Net行为型设计模式之中介者模式(Mediator)

.Net行为型设计模式之中介者模式(Mediator)

一、动机(Motivate)

为什么要使用中介者模式呢?如果不使用中介者模式的话,各个同事对象将会相互进行引用,如果每个对象都与多个对象进行交互时,将会形成如下图所示的网状结构。

从上图可以发现,如果不使用中介者模式的话,每个对象之间过度耦合,这样的既不利于类的复用也不利于扩展。如果引入了中介者模式,那么对象之间的关系将变成星型结构,采用中介者模式之后会形成如下图所示的结构:

从上图可以发现,使用中介者模式之后,任何一个类的变化,只会影响中介者和类本身,不像之前的设计,任何一个类的变化都会引起其关联所有类的变化。这样的设计大大减少了系统的耦合度。

在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断地变化。
在这种情况下,我们可使用一个“中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。

二、意图(Intent)

定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为。                                 ——《设计模式》GoF

三、结构图(Structure)

四、模式的组成

可以看出,在中介者模式的结构图有以下角色:
(1)、抽象中介者角色(Mediator):在里面定义各个同事之间交互需要的方法,可以是公共的通信方法,也可以是小范围的交互方法。
(2)、具体中介者角色(ConcreteMediator):它需要了解并维护各个同事对象,并负责具体的协调各同事对象的交互关系。
(3)、抽象同事类(Colleague):通常为抽象类,主要约束同事对象的类型,并实现一些具体同事类之间的公共功能,比如,每个具体同事类都应该知道中介者对象,也就是具体同事类都会持有中介者对象,都可以到这个类里面。
(4)、具体同事类(ConcreteColleague):实现自己的业务,需要与其他同事通信时候,就与持有的中介者通信,中介者会负责与其他同事类交互。

五、中介者模式的代码实现

中介者模式在现实生活中也有类似的例子,不论是QQ群或者是微信群,或者手提电话,它们都是充当一个中间平台,QQ用户可以登录这个中间平台与其他QQ用户进行交流,如果没有这些中间平台,我们如果想与朋友进行聊天的话,可能就需要当面才可以了。比如:在公司管理过程中,就会涉及到各个部门之间的协调和合作,如何各个部门直接来沟通,看着好像直接高效,其实不然。各个部门之间为了完成一个工作,沟通协调就需要一个人来做这个工作,谁呢?总经理,我们这里就把总经理定义为成总的管理者,各个部门需要向他汇报和发起工作请求。

static void Main(String[] args)
{
    President mediator = new President();
    Market market = new Market(mediator);
    Development development = new Development(mediator);
    Financial financial = new Financial(mediator);

    mediator.SetFinancial(financial);
    mediator.SetDevelopment(development);
    mediator.SetMarket(market);

    market.Process();
    market.Apply();

}

//抽象中介者角色
public interface Mediator
{
    void Command(Department department);
}

//总经理--相当于具体中介者角色
public sealed class President : Mediator
{
    //总经理有各个部门的管理权限
    private Financial _financial;
    private Market _market;
    private Development _development;

    public void SetFinancial(Financial financial)
    {
        this._financial = financial;
    }
    public void SetDevelopment(Development development)
    {
        this._development = development;
    }
    public void SetMarket(Market market)
    {
        this._market = market;
    }

    public void Command(Department department)
    {
        if (department.GetType() == typeof(Market))
        {
            _financial.Process();
        }
    }
}

//同事类的接口
public abstract class Department
{
    //持有中介者(总经理)的引用
    private Mediator mediator;

    protected Department(Mediator mediator)
    {
        this.mediator = mediator;
    }

    public Mediator GetMediator
    {
        get { return mediator; }
        private set { this.mediator = value; }
    }

    //做本部门的事情
    public abstract void Process();

    //向总经理发出申请
    public abstract void Apply();
}

//开发部门
public sealed class Development : Department
{
    public Development(Mediator m) : base(m) { }

    public override void Process()
    {
        Console.WriteLine("我们是开发部门,要进行项目开发,没钱了,需要资金支持!");
    }

    public override void Apply()
    {
        Console.WriteLine("专心科研,开发项目!");
    }
}

//财务部门
public sealed class Financial : Department
{
    public Financial(Mediator m) : base(m) { }

    public override void Process()
    {
        Console.WriteLine("汇报工作!没钱了,钱太多了!怎么花?");
    }

    public override void Apply()
    {
        Console.WriteLine("数钱!");
    }
}

//市场部门
public sealed class Market : Department
{
    public Market(Mediator mediator) : base(mediator) { }

    public override void Process()
    {
        Console.WriteLine("汇报工作!项目承接的进度,需要资金支持!");
        GetMediator.Command(this);
    }

    public override void Apply()
    {
        Console.WriteLine("跑去接项目!");
    }
}

六、中介者模式的实现要点:

将多个对象间复杂的关联关系解耦,Mediator模式将多个对象间的控制逻辑进行集中管理,变“多个对象互相关联”为“多个对象和一个中介者关联”,简化了系统的维护,抵御了可能的变化。随着控制逻辑的复杂化,Mediator具体对象的实现可能相当复杂。这时候可以对Mediator对象进行分解处理。

  • Facade模式是解耦系统外到系统内(单向)的对相关联关系
  • Mediator模式是解耦系统内各个对象之间(双向)的关联关系

1、中介者模式的优点

(1)、松散耦合:中介者模式通过把多个同事对象之间的交互封装到中介对象里面,从而使得对象之间松散耦合,基本上可以做到互不依赖。这样一来,同时对象就可以独立的变化和复用,不再“牵一发动全身”
(2)、集中控制交互:多个同事对象的交互,被封装在中介者对象里面集中管理,使得这些交互行为发生变化的时候,只需要修改中介者就可以了。
(3)、多对多变为一对多:没有中介者模式的时候,同事对象之间的关系通常是多对多,引入中介者对象后,中介者和同事对象的关系通常变为双向的一对多,这会让对象的关系更容易理解和实现。

2、中介者模式的缺点

过多集中化:如果同事对象之间的交互非常多,而且比较复杂,当这些复杂性全都集中到中介者的时候,会导致中介者对象变的十分复杂,而且难于维护和管理。

七、.NET 中介者模式的实现

根据我个人的理解,微软的ASP.NET MVC开发模式就是一个中介者模式的很好的实现,其中C就是Controller,也就是中文所说的控制器,控制器就是一个中介者,M和V和它打交道,具体的情况大家可以去查看相关资料,这方面的资料还是很多的。

到此这篇关于.Net行为型设计模式之中介者模式(Mediator)的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。

您可能感兴趣的文章:
  • .Net行为型设计模式之备忘录模式(Memento)
  • .Net行为型设计模式之访问者模式(Visitor)
  • .Net行为型设计模式之职责链模式(Chain of Responsibility)
  • .Net行为型设计模式之策略模式(Stragety)
  • .Net行为型设计模式之状态模式(State)
  • .Net行为型设计模式之观察者模式(Observer)
  • .Net行为型设计模式之迭代器模式(Iterator)
  • .Net行为型设计模式之命令模式(Command)
  • .Net行为型设计模式之模板方法模式(Template Method)
  • .Net行为型设计模式之解释器模式(Interpreter)

23、行为型 - 中介者模式(Mediator)

23、行为型 - 中介者模式(Mediator)

中介者模式 (Mediator Pattern):用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。

中介者模式包含如下几个角色:

● Mediator(抽象中介者):它定义一个接口,该接口用于与各同事对象之间进行通信。
● ConcreteMediator(具体中介者):它是抽象中介者的子类,通过协调各个同事对象来实现协作行为,它维持了对各个同事对象的引用。
● Colleague(抽象同事类):它定义各个同事类公有的方法,并声明了一些抽象方法来供子类实现,同时它维持了一个对抽象中介者类的引用,其子类可以通过该引用来与中介者通信。
● ConcreteColleague(具体同事类):它是抽象同事类的子类;每一个同事对象在需要和其他同事对象通信时,先与中介者通信,通过中介者来间接完成与其他同事类的通信;在具体同事类中实现了在抽象同事类中声明的抽象方法

1、主要优点

(1) 中介者模式简化了对象之间的交互,它用中介者和同事的一对多交互代替了原来同事之间的多对多交互,一对多关系更容易理解、维护和扩展,将原本难以理解的网状结构转换成相对简单的星型结构。
(2) 中介者模式可将各同事对象解耦。中介者有利于各同事之间的松耦合,我们可以独立的改变和复用每一个同事和中介者,增加新的中介者和新的同事类都比较方便,更好地符合“开闭原则”。
(3) 可以减少子类生成,中介者将原本分布于多个对象间的行为集中在一起,改变这些行为只需生成新的中介者子类即可,这使各个同事类可被重用,无须对同事类进行扩展。

2、主要缺点

在具体中介者类中包含了大量同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。

3、适用场景

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

我们就以租房为例,中介机构充当租房者与房屋所有者之间的中介者

输入图片说明

/**
 * 2018/12/6
 * 抽象中介者
 *
 * @author machuanpeng
 */ 
public abstract class Mediator {
    //申明一个联络方法
    public abstract void constact(String message,Person person);
}
/**
 * 2018/12/6
 * 抽象同事对象
 *
 * @author machuanpeng
 */
public abstract class Person {
    
    protected String name;
    protected Mediator mediator;
    
    Person() {}
    
    Person(String name, Mediator mediator) {
        this.name = name;
        this.mediator = mediator;
    }
    
    /**与中介者联系*/
    public void constact(String message){
        mediator.constact(message, this);
    }

    /**获取信息*/
    public void getMessage(String message);
    
    public void getName() {
        return this.name;
	}
    
    public void setName(String name) {
        this.name = name;
	}
    
    public void getMediator() {
        return this.mediator;
	}
    
    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
	}
}
/**
 * 2018/12/6
 * 房主
 *
 * @author machuanpeng
 */
public class HouseOwner extends Person{

    HouseOwner(String name, Mediator mediator) {
        super(name, mediator);
    }

    public void getMessage(String message){
        System.out.println("房主:" + name +",获得信息:" + message);
    }
}
/**
 * 2018/12/6
 * 租客
 *
 * @author machuanpeng
 */
public class Renter extends Person{

    Renter(String name, Mediator mediator) {
        super(name, mediator);
    }

    public void getMessage(String message){
        System.out.println("租客:" + name +",获得信息:" + message);
    }
}
/**
 * 2018/12/6
 * 具体中介者对象
 *
 * @author machuanpeng
 */
public class MediatorStructure extends Mediator{
    //首先中介结构必须知道所有房主和租房者的信息
    private HouseOwner houseOwner;
    private Renter renter;
    
    public void constact(String message, Person person) {
        if(person == houseOwner){ 
            //如果是房主,则租房者获得信息
            renter.getMessage(message);
        }else{ 
            //反正则是房主获得信息
            houseOwner.getMessage(message);
        }
    }

    public HouseOwner getHouseOwner() {
        return houseOwner;
    }

    public void setHouseOwner(HouseOwner houseOwner) {
        this.houseOwner = houseOwner;
    }

    public Renter getRenter() {
        return renter;
    }

    public void setRenter(Renter renter) {
        this.renter = renter;
    }
}

测试:

public class Client {
    public static void main(String[] args) {
        //一个房主、一个租房者、一个中介机构
        MediatorStructure mediator = new MediatorStructure();
        
        //房主和租房者只需要知道中介机构即可
        HouseOwner houseOwner = new HouseOwner("张三", mediator);
        Renter renter = new Renter("李四", mediator);
        
        //中介结构要知道房主和租房者
        mediator.setHouseOwner(houseOwner);
        mediator.setRenter(renter);
        
        renter.constact("听说你那里有三室的房主出租.....");
        houseOwner.constact("是的!请问你需要租吗?");
    }
}

C#设计模式之Mediator中介者模式解决程序员的七夕缘分问题示例

C#设计模式之Mediator中介者模式解决程序员的七夕缘分问题示例

本文实例讲述了C#设计模式之Mediator中介者模式解决程序员的七夕缘分问题。分享给大家供大家参考,具体如下:

一、理论定义

中介者模式  定义了一种一对多的操作,解脱了对象之间多对多的引用依赖,所有对象之间的通信,都封装在 中介者里面。

二、应用举例

需求描述: 七夕来啦,谁说程序员就一定 是单身苦逼呢,程序员也有自己的幸福。

也在追寻自己的缘分,我们都是有理想,有文化,有独立见解的群体,
我们为 信息社会所做的努力,能给我们七夕带来好运。告别单身,开始行动啦!

1.三个程序员 找到了 缘分"YuanFen"大师,希望找到自己另一半,
2.六个美女: 刘诗诗,蒋琴琴,白富美,朱莉,舒淇,语嫣 也找到 缘分"YuanFen" 大师,
希望心中的 白马王子能给自己一注目光。
3.缘分大师  接受了程序员 和 美女的请求。
4.开始缘分派对啦!

三、具体编码

1.美女们(Grils)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Com.Design.Gof.Mediator
{
  public class Girls
  {
    /// <summary>
    /// 美女名字
    /// </summary>
    public string Name { get; set; }
    /// <summary>
    /// 找了一个叫“缘分” 的中介者 做媒婆
    /// </summary>
    public YuanFen YuanFen { get; set; }
    /// <summary>
    /// 向自己心目中的 白马王子发信
    /// </summary>
    /// <param name="name_message">名字和信息</param>
    public void SendMessage(Dictionary<string,string> name_message) {
      YuanFen.SendToBoys(name_message);
    }
    /// <summary>
    /// 收到某个白马王子回信
    /// </summary>
    public void RecieveMessage(string msg)
    {
      Console.WriteLine(msg);
    }
  }
}

2. 帅哥程序员

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Com.Design.Gof.Mediator
{
  /// <summary>
  /// 帅哥 1
  /// </summary>
  public class Boys
  {
    /// <summary>
    /// 帅哥名字
    /// </summary>
    public string Name { get; set; }
    /// <summary>
    /// 找了一个叫“缘分” 的中介者 做媒婆
    /// </summary>
    public YuanFen YuanFen { get; set; }
    /// <summary>
    ///向自己心目中的 白雪公主发信
    /// </summary>
    /// <param name="name_message">名字和信息</param>
    public void SendMessage(Dictionary<string, string> name_message)
    {
      YuanFen.SendToGrils(name_message);
    }
    /// <summary>
    /// 收到某个白雪公主回信
    /// </summary>
    public void RecieveMessage(string msg)
    {
      Console.WriteLine(msg);
    }
  }
}

3.缘分

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Com.Design.Gof.Mediator
{
  public class YuanFen
  {
    public List<Girls> Girls { get; set; }
    public List<Boys> Boys { get; set; }
    /// <summary>
    /// 男孩向女孩发信
    /// </summary>
    /// <param name="name_message"></param>
    public void SendToGrils(Dictionary<string, string> name_message)
    {
      foreach (var k in name_message) {
        foreach (var girl in Girls) {
          if (k.Key == girl.Name) {
            girl.RecieveMessage(k.Value);
          }
        }
      }
    }
    /// <summary>
    /// 女孩向男孩发信
    /// </summary>
    /// <param name="name_message"></param>
    public void SendToBoys(Dictionary<string, string> name_message)
    {
      foreach (var k in name_message)
      {
        foreach (var boy in Boys)
        {
          if (k.Key == boy.Name)
          {
            boy.RecieveMessage(k.Value);
          }
        }
      }
    }
  }
}

4.主函数(派对,发情书)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Com.Design.Gof.Mediator;
namespace Com.Design.Gof.Test
{
  class Program
  {
    static void Main(string[] args)
    {
      //缘分 这个 媒婆来了
      YuanFen yuanFen = new YuanFen { Boys=new List<Boys>(), Girls=new List<Girls>()};
      //男孩子们雀跃报名啊
      Boys boy1 = new Boys { Name="程序员1", YuanFen=yuanFen};
      Boys boy2 = new Boys { Name = "程序员2", YuanFen = yuanFen };
      Boys boy3 = new Boys { Name = "程序员3", YuanFen = yuanFen };
      //缘分接受了男孩子的夙愿
      yuanFen.Boys.Add(boy1); yuanFen.Boys.Add(boy2); yuanFen.Boys.Add(boy3);
      //女孩子也很积极
      Girls girls1 = new Girls { Name="刘诗诗", YuanFen=yuanFen};
      Girls girls2 = new Girls { Name = "白富美", YuanFen = yuanFen };
      Girls girls3 = new Girls { Name = "蒋琴琴", YuanFen = yuanFen };
      Girls girls4 = new Girls { Name = "舒淇", YuanFen = yuanFen };
      Girls girls5 = new Girls { Name = "朱莉", YuanFen = yuanFen };
      Girls girls6 = new Girls { Name = "语嫣", YuanFen = yuanFen };
      //缘分接受了美女们的爱情 丘比特
      yuanFen.Girls.Add(girls1); yuanFen.Girls.Add(girls2); yuanFen.Girls.Add(girls3);
      yuanFen.Girls.Add(girls4); yuanFen.Girls.Add(girls5); yuanFen.Girls.Add(girls6);
      //开始派对啦
      //程序员1 对 刘诗诗,蒋琴琴 感兴趣
      Dictionary<string, string> name_message = new Dictionary<string, string>();
      name_message.Add("刘诗诗", boy1.Name + " 对刘诗诗说: 诗诗诗诗 我爱你,就像老鼠爱大米");
      name_message.Add("蒋琴琴", boy1.Name + " 对蒋琴琴说: 我希望每天睡前最后看到的人是你...... ");
      boy1.SendMessage(name_message);
      name_message.Clear();
      Console.WriteLine();
      //程序员2 对 刘诗诗,朱莉,舒淇 感兴趣
      name_message.Add("语嫣", boy2.Name + " 对语嫣说: 地球仍然转动,世界依旧善变,而我永远爱你");
      name_message.Add("朱莉", boy2.Name + " 对朱莉说: 每天都 ...很想妳... ");
      name_message.Add("舒淇", boy2.Name + " 对舒淇说: 曾经迷惘的心中,是你牵引我走出寂寞 ");
      boy2.SendMessage(name_message);
      name_message.Clear();
      Console.WriteLine();
      //语嫣 对三个程序员都感兴趣
      name_message.Add("程序员1", girls6.Name + " 对程序员1说: 想想和我一起看日升日落的喜悦吧!...嘻嘻");
      name_message.Add("程序员2", girls6.Name + " 对程序员2说: 我的世界只有你懂.... ");
      name_message.Add("程序员3", girls6.Name + " 对程序员3说: 因为知道不能没有你,所以会更珍惜 ");
      girls6.SendMessage(name_message);
      name_message.Clear();
      Console.WriteLine();
      //蒋琴琴 很钟情,很专一,只给程序员1 发信
      name_message.Add("程序员1", girls3.Name + " 对程序员1说: 爱你一生伴你一世,你的心跳只有我听得到");
      girls3.SendMessage(name_message);
      Console.ReadKey();
    }
  }
}

5.运行结果

6.总结

七夕来了,找回自己的缘分。

附:完整实例代码点击此处本站下载

更多关于C#相关内容还可查看本站专题:《C#数据结构与算法教程》、《C#窗体操作技巧汇总》、《C#常见控件用法教程》、《WinForm控件用法总结》、《C#数组操作技巧总结》及《C#面向对象程序设计入门教程》

希望本文所述对大家C#程序设计有所帮助。

您可能感兴趣的文章:
  • 详解C#设计模式编程中生成器模式的使用
  • C#设计模式之Template模板方法模式实现ASP.NET自定义控件 密码强度检测功能
  • C#设计模式之Visitor访问者模式解决长隆欢乐世界问题实例
  • C#设计模式之Strategy策略模式解决007大破密码危机问题示例
  • C#设计模式之ChainOfResponsibility职责链模式解决真假美猴王问题实例
  • C#设计模式之Observer观察者模式解决牛顿童鞋成绩问题示例
  • C#设计模式之单例模式实例讲解
  • c#设计模式 适配器模式详细介绍
  • C#设计模式之观察者模式实例讲解
  • 实例解析C#设计模式编程中简单工厂模式的使用
  • C#设计模式之外观模式介绍
  • C#设计模式之Builder生成器模式解决带老婆配置电脑问题实例

C#设计模式之十七中介者模式(Mediator Pattern)【行为型】

C#设计模式之十七中介者模式(Mediator Pattern)【行为型】

一、引言

   今天我们开始讲“行为型”设计模式的第五个模式,该模式是【中介者模式】,英文名称是:Mediator Pattern。还是老套路,先从名字上来看看。“中介者模式”我第一次看到这个名称,我的理解是,在两个对象中间增加一个“中间对象”,“中间对象”协调两个对象的关系,但是随着理解的深入,“中间对象”处理关系的对象可能不只是两个对象,可能是三个对象,或者更多对象。中介者模式在现实生活中的例子很多,比如:A对象和B对象做生意,如果A对象和B对象是一次性买卖,没有讨价还价的过程,A对象和B对象直接见面更好。但是A对象或者B对象的想法经常变,每次想法的改变都通知对方,就会使对方很反感,而且也不利于生意的顺利进行。如果在A对象和B对象之间增加一个C对象,在最终确定之前不要告诉C对象,对方也就不知道(隔离了耦合,对方可以更具需求变化),等一方最终确定想法后,把最后决定告诉C对象,C对象再转告对方,这样就简化了A对象和B对象的交易过程,而且双方都很满意。在软件构建过程中,因为有了变化,才有增加中介者的需要,如果没有变化,可以一次搞定,直接硬编码也没关系,所以说“变化”是模式的前提,无论是什么模式,就因为有变化,我们需要抵御变化,才要使用相应的模式来解决问题。

二、中介者模式的详细介绍

2.1、动机(Motivate)

   在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断地变化。

  在这种情况下,我们可使用一个“中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。

2.2、意图(Intent)

   定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为。                                      ——《设计模式》GoF

2.3、结构图(Structure)

     



2.4、模式的组成
    
    可以看出,在中介者模式的结构图有以下角色:

    (1)、抽象中介者角色(Mediator):在里面定义各个同事之间交互需要的方法,可以是公共的通信方法,也可以是小范围的交互方法。

    (2)、具体中介者角色(ConcreteMediator):它需要了解并维护各个同事对象,并负责具体的协调各同事对象的交互关系。

    (3)、抽象同事类(Colleague):通常为抽象类,主要约束同事对象的类型,并实现一些具体同事类之间的公共功能,比如,每个具体同事类都应该知道中介者对象,也就是具体同事类都会持有中介者对象,都可以到这个类里面。

    (4)、具体同事类(ConcreteColleague):实现自己的业务,需要与其他同事通信时候,就与持有的中介者通信,中介者会负责与其他同事类交互。


2.5、中介者模式的代码实现

    中介者模式在现实生活中也有类似的例子,不论是QQ群或者是微信群,或者手提电话,它们都是充当一个中间平台,QQ用户可以登录这个中间平台与其他QQ用户进行交流,如果没有这些中间平台,我们如果想与朋友进行聊天的话,可能就需要当面才可以了。比如:在公司管理过程中,就会涉及到各个部门之间的协调和合作,如何各个部门直接来沟通,看着好像直接高效,其实不然。各个部门之间为了完成一个工作,沟通协调就需要一个人来做这个工作,谁呢?总经理,我们这里就把总经理定义为成总的管理者,各个部门需要向他汇报和发起工作请求。我们看代码吧,实现代码如下:

  1 namespace 中介者模式的实现
  2 {
  3     //抽象中介者角色
  4     public interface Mediator
  5     {
  6         void Command(Department department);
  7     }
  8 
  9     总经理--相当于具体中介者角色
 10     sealed class President : Mediator
 11  12         总经理有各个部门的管理权限
 13         private Financial _financial;
 14          Market _market;
 15          Development _development;
 16 
 17          SetFinancial(Financial financial)
 18         {
 19             this._financial = financial;
 20         }
 21          SetDevelopment(Development development)
 22  23             this._development = development;
 24  25          SetMarket(Market market)
 26  27             this._market = market;
 28  29 
 30          Command(Department department)
 31  32             if (department.GetType() == typeof(Market))
 33             {
 34                 _financial.Process();
 35             }
 36  37  38 
 39     同事类的接口
 40     abstract  Department
 41  42         持有中介者(总经理)的引用
 43          Mediator mediator;
 44 
 45         protected Department(Mediator mediator)
 46  47             this.mediator = mediator;
 48  49 
 50         public Mediator GetMediator
 51  52             get { return mediator; }
 53             private set {  value; }
 54  55 
 56         做本部门的事情
 57          Process();
 58 
 59         向总经理发出申请
 60          Apply();
 61  62 
 63     开发部门
 64      Development : Department
 65  66         public Development(Mediator m) : base(m) { }
 67 
 68         override  Process()
 69  70             Console.WriteLine("我们是开发部门,要进行项目开发,没钱了,需要资金支持!");
 71  72 
 73          Apply()
 74  75             Console.WriteLine(专心科研,开发项目! 76  77  78 
 79     财务部门
 80      Financial : Department
 81  82         public Financial(Mediator m) :  83 
 84          85  86             Console.WriteLine(汇报工作!没钱了,钱太多了!怎么花? 87  88 
 89          90  91             Console.WriteLine(数钱! 92  93  94 
 95     市场部门
 96      Market : Department
 97  98         public Market(Mediator mediator) : (mediator) { }
 99 
100         101 102             Console.WriteLine(汇报工作!项目承接的进度,需要资金支持!103             GetMediator.Command(this104 105 
106         107 108             Console.WriteLine(跑去接项目!109 110 111 
112 
113      Program
114 115         static  Main(String[] args)
116 117             President mediator = new President();
118             Market market =  Market(mediator);
119             Development development =  Development(mediator);
120             Financial financial =  Financial(mediator);
121 
122             mediator.SetFinancial(financial);
123             mediator.SetDevelopment(development);
124             mediator.SetMarket(market);
125 
126             market.Process();
127             market.Apply();
128 
129             Console.Read();
130 131 132 }


三、中介者模式的实现要点:
    
    将多个对象间复杂的关联关系解耦,Mediator模式将多个对象间的控制逻辑进行集中管理,变“多个对象互相关联”为“多个对象和一个中介者关联”,简化了系统的维护,抵御了可能的变化。随着控制逻辑的复杂化,Mediator具体对象的实现可能相当复杂。这时候可以对Mediator对象进行分解处理。

  Facade模式是解耦系统外到系统内(单向)的对相关联关系

  Mediator模式是解耦系统内各个对象之间(双向)的关联关系

    3.1】、中介者模式的优点

          (1)、松散耦合

                   中介者模式通过把多个同事对象之间的交互封装到中介对象里面,从而使得对象之间松散耦合,基本上可以做到互不依赖。这样一来,同时对象就可以独立的变化和复用,不再“牵一发动全身”

          (2)、集中控制交互

                   多个同事对象的交互,被封装在中介者对象里面集中管理,使得这些交互行为发生变化的时候,只需要修改中介者就可以了。

          (3)、多对多变为一对多
 
                   没有中介者模式的时候,同事对象之间的关系通常是多对多,引入中介者对象后,中介者和同事对象的关系通常变为双向的一对多,这会让对象的关系更容易理解和实现。

     3.2】、中介者模式的缺点

          (1)、过多集中化

                 如果同事对象之间的交互非常多,而且比较复杂,当这些复杂性全都集中到中介者的时候,会导致中介者对象变的十分复杂,而且难于维护和管理。

四、.NET 中介者模式的实现

     根据我个人的理解,微软的ASP.NET MVC开发模式就是一个中介者模式的很好的实现,其中C就是Controller,也就是中文所说的控制器,控制器就是一个中介者,M和V和它打交道,具体的情况大家可以去查看相关资料,这方面的资料还是很多的。

五、总结

    这个模式终于写完了,我们总结一下,为什么要使用中介者模式呢?如果不使用中介者模式的话,各个同事对象将会相互进行引用,如果每个对象都与多个对象进行交互时,将会形成如下图所示的网状结构。

 



从上图可以发现,如果不使用中介者模式的话,每个对象之间过度耦合,这样的既不利于类的复用也不利于扩展。如果引入了中介者模式,那么对象之间的关系将变成星型结构,采用中介者模式之后会形成如下图所示的结构:

 



从上图可以发现,使用中介者模式之后,任何一个类的变化,只会影响中介者和类本身,不像之前的设计,任何一个类的变化都会引起其关联所有类的变化。这样的设计大大减少了系统的耦合度。

总结

以上是小编为你收集整理的C#设计模式之十七中介者模式(Mediator Pattern)【行为型】全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

关于中介模式Mediator中介模式和代理模式的区别的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于.Net行为型设计模式之中介者模式(Mediator)、23、行为型 - 中介者模式(Mediator)、C#设计模式之Mediator中介者模式解决程序员的七夕缘分问题示例、C#设计模式之十七中介者模式(Mediator Pattern)【行为型】的相关信息,请在本站寻找。

本文标签: