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


    场景:与朋友通信件

     

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

     

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

    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/

    转载请注明:博客园

  • 相关阅读:
    .net百度编辑器的使用
    phpstudy远程连接mysql
    HDU-2389 Rain on your Parade
    HDU-2768 Cat vs. Dog
    HDU-1151 Air Raid
    HDU-1507 Uncle Tom's Inherited Land*
    HDU-1528/1962 Card Game Cheater
    HDU-3360 National Treasures
    HDU-2413 Against Mammoths
    HDU-1045 Fire Net
  • 原文地址:https://www.cnblogs.com/jams742003/p/1618425.html
Copyright © 2020-2023  润新知