设计模式-中介者模式

最近伊拉克又接连发起了多起爆炸事件,战争带给人类的真是无法弥补的伤痛。

由于各国之间代表的利益不同,所以矛盾冲突是难免的,但如果有这么一个组织,由各国的代表组成,用来维护国际和平与安全,解决国际间经济、社会、文化和人道主义性质的问题,不就很好么?

这个组织就是联合国组织,它就是一个调停者、中介者的角色。

国与国之间的关系,就类似于不同的对象与对象之间的关系,这就要求对象之间需要直到其他所有对象,尽管将一个系统分割成许多对象通常可以增加其复用性,但是对象间相互连接的激增又会降低其可复用性了。

大量的连接使得一个对象不可能在没有其他对象的支持下工作,系统表现为一个不可分割的整体,所以,对系统的行为进行任何较大的改动就十分困难了。

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Mediator
{
    //联合国机构
    abstract class UnitedNations
    {
        //声明
        public abstract void Send(string message, Country colleague);
    }
    //国家类 
    abstract class Country
    {
        protected UnitedNations mediator;

        public Country(UnitedNations mediator)
        {
            this.mediator = mediator;
        }
    }
    //美国
    class USA : Country
    {
        public USA(UnitedNations mediator)
            : base(mediator)
        {
        }
        //声明
        public void Declare(string message)
        {
            mediator.Send(message, this);
        }
        //获得消息
        public void GetMessage(string message)
        {
            Console.WriteLine("美国收到消息:" + message);
        }
    }
    //伊拉克类
    class Irap : Country
    {
        public Irap(UnitedNations mediator)
            : base(mediator)
        {
        }
        //声明
        public void Declare(string message)
        {
            mediator.Send(message, this);
        }
        //获得消息
        public  void GetMessage(string message)
        {
            Console.WriteLine("伊拉克收到消息:" + message);
        }
    }
    //联合国安全理事会
    class UnitedNationsSecurityCouncil : UnitedNations
    {
        //了解所有的国家,所以拥有美国和伊拉克的对象属性
        private USA colleague1;
        private Irap colleague2;
        //美国
        public USA Colleague1
        {
            set { colleague1 = value; }
        }
        //伊拉克
        public Irap Colleague2
        {
            set { colleague2 = value; }
        }
        //声明 重写了声明方法,实现了两个对象间的通信
        public override void Send(string message, Country colleague)
        {
            if (colleague == colleague1)
            {
                colleague2.GetMessage(message);
            }
            else
            {
                colleague1.GetMessage(message);
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            UnitedNationsSecurityCouncil UNSC = new UnitedNationsSecurityCouncil();
            USA c1 = new USA(UNSC);
            Irap c2 = new Irap(UNSC);

            UNSC.Colleague1 = c1;
            UNSC.Colleague2 = c2;

            c1.Declare("不准研制核武器,否则要发动战争!");
            c2.Declare("我们没有核武器,也不怕侵略");

            Console.Read();
        }
    }
}

中介者模式很容易在系统中应用,也很容易在系统中误用,当系统出现了多对多交互复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。

中介者模式的优点:减少饿了各个Collegue的耦合,使得可以独立地改变和复用各个Colleague类和Mediator。由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。

由于ConcreteMediator控制了集中化,于是就把交互复杂性变成了中介者的复杂性,这就使得中介者会变得比任何一个ConcreteColleague都复杂。

中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值