模式实例之——中介者实例

场景:与朋友通信件

 

描述:东北的赵大宝向山东水泊梁山的好汉王英寄了一封信

 

(一)实体类(用于维持数据)

public class User

    {

        public string Address { get; set; }

        public string PostCode { get; set; }

        public string Name { get; set; }

    }

(二)赵大宝与王英(同事关系)抽象接口

public interface IPerson

    {

        User Sender{get;set;}

        User Receiver{get;set;}

}

收信人的地址信息,与寄信的地址信息

(三)赵大宝

public class Zhao : IPerson

    {

        #region IPerson 成员

 

        public User Sender

        {

            get;

            set;

        }

 

        public User Receiver

        {

            get;

            set;

        }

 

        #endregion

    }

(四)王英

public class Wang : IPerson

    {

        #region IPerson 成员

 

        public User Sender

        {

            get;

            set;

        }

 

        public User Receiver

        {

            get;

            set;

        }

 

        #endregion

 

    }

(五)中介者抽象

public abstract class Mediator

    {

        public abstract void Send();

        public abstract void Receive();

        public abstract void Register(IPerson person);

}

注册收信人与寄信人,可以把本地信件发往各地(Send),也可以接收从其它各地寄往本地的信件(Receive

(六)本地邮局(中介者实现)

public class Postoffice : Mediator

    {

        private User _sender;

        private User _receiver;

 

        public override void Send()

        {

            if (_receiver != null)

            {

                Console.WriteLine("向住在"+_receiver.Address+"" + _receiver.Name + "寄了一封信!"+"邮编是"+_receiver.PostCode);

            }

            else

                Console.WriteLine("没有信件邮寄!");

        }

 

        public override void Receive()

        {

            if (_sender != null)

            {

                Console.WriteLine("收到住在" + _sender.Address + "" + _sender.Name + "寄来的一封信!" + _sender.PostCode);

            }

            else

                Console.WriteLine("没有收到信件!");

        }

 

        public override void Register(IPerson person)

        {

            _sender = person.Sender;

            _receiver = person.Receiver;

        }

    }

(七)测试

public void TestMediator()

{

    IPerson zhao = new Zhao();

 

    User _zhao = new User { Name="赵大宝", Address="东北某地", PostCode="1212121" };

    User _wang = new User {Name="王英",Address="山东梁山泊",PostCode="3636363" };

 

    zhao.Sender = _zhao;

    zhao.Receiver = _wang;

 

    Mediator mdor = new Postoffice();

    mdor.Register(zhao);

 

    mdor.Send();

    mdor.Receive();

}

 

 

东北的赵大宝向山东的王英寄了一封信……

 

结果:

 

向住在山东梁山泊的王英寄了一封信!邮编是3636363
收到住在东北某地的赵大宝寄来的一封信!1212121

 

中介者模式要求每个同事都知道中介者,但这种方式实现,我觉得也可以。

以下是正常实现方式

(一)   实体类

用于维持数据

public class User

    {

        public string Address { get; set; }

        public string PostCode { get; set; }

        public string Name { get; set; }

    }

(二)   同事抽象接口

public abstract class Person

    {

        protected Mediator _mediator;

        User Sender { get; set; }

        User Receiver { get; set; }

        public abstract void SetMediator(Mediator mediator);

 

        public abstract void Send();

  }

(三)   寄信人

public class People : Person

    {

        public User Sender

        {

            get;

            set;

        }

 

        public User Receiver

        {

            get;

            set;

        }

 

        public override void SetMediator(Mediator mediator)

        {

            _mediator= mediator;

        }

 

        public override void Send()

        {

            _mediator.Send(Sender, Receiver);

        }

    }

(四)   中介者抽象

public abstract class Mediator

    {

        public abstract void Send(User sender, User receiver);

}

(五)   本地邮局(中介者实现)

public class Postoffice : Mediator

    {

        public override void Send(User sender, User receiver)

        {

                Console.WriteLine(sender.Name+"向住在" +

receiver.Address + "" + receiver.Name + "寄了一封信!"

 + "邮编是" + receiver.PostCode);

        }

    }

(六)   测试

       public void TestMediator()

        {

            Postoffice post = new Postoffice();

 

            People z1 = new People();

            z1.SetMediator(post);

           

            User _zhao = new User { Name = "赵大宝", Address = "东北某地", PostCode = "1212121" };

            User _wang = new User { Name = "王英", Address = "山东梁山泊", PostCode = "3636363" };

 

            z1.Sender = _zhao;

            z1.Receiver = _wang;

 

            z1.Send();

        }

 

东北的赵大宝向山东的王英寄了一封信……

 

结果:

赵大宝向住在山东梁山泊的王英寄了一封信!邮编是3636363

 

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

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

 

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

 

要点:

1,将多个对象间复杂的关联关系解耦,Mediator模式将多个对象间的控制逻辑进行集中管理,变多个对象互相关系为多个对象和一个中介者关联,简化了系统的维护,抵御了可能的变化。

2,随着控制逻辑的复杂化,Mediator具体对象的实现可能相当复杂。 这时候可以对Mediator对象进行分解处理。

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

 

 

众多的对象间相互关联,相互交互,它们之间常维持着一种复杂的引用关系,把关联关系抽象出来,使众多对象间的相互关联相互交互转为众多对象与中间人关联,做为中转站。在这个例子中,人与人之间的信件往来是多多关联的,且每个人执行各自的信件往来功能(我猜想最早的信件往来是以人带捎的形式实现的,不会自己写的信,自己送吧。而这一具体的事物在一开始便是这种模式的最好体现)。

信件往来中有3个对象:送信的,收信的,邮局。邮局来实现关联对象的功能:寄,收。

 

博客园大道至简

http://www.cnblogs.com/jams742003/

转载请注明:博客园

原文地址:https://www.cnblogs.com/jams742003/p/1618425.html