行为模式之五---Mediator

1、结构图

行为模式之五---Mediator_第1张图片

2、代码

 

 
/**********************
 * 意图:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显
 * 式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
 * 适用性:
 * 1、一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。 
 * 2、一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。 
 * 3、想定制一个分布在多个类中的行为,而又不想生成太多的子类。
 * 协作:同事向一个中介者对象发送和接收请求。中介者在各同事间适当地转发请求以实现协作行为。
 * 作者:董怀信
 * 日期:2009-06-08
 * *********************************************************/
 
using System;
 
namespace DesignPattern.BehavioralPattern
{
    /// <summary>
    /// 中介者定义一个接口用于与各同事(Colleague)对象通信。
    /// </summary>
    public abstract class Mediator
    {
        public abstract void Inform();
        public abstract void SetColleagues(Colleague colleague1, Colleague colleague2);
    }
 
    /// <summary>
    /// 具体中介者通过协调各同事对象实现协作行为。
    /// 了解并维护它的各个同事。
    /// </summary>
    public class ConcreteMediator:Mediator
    {
        Colleague m_colleague1;
        Colleague m_colleague2;
        public ConcreteMediator()
        {
        }
 
        public override void SetColleagues(Colleague colleague1, Colleague colleague2)
        {
            m_colleague1 = colleague1;
            m_colleague2 = colleague2;
        }
 
 
 
        public override void Inform()
        {
            m_colleague2.ValueChanged();
        }
    }
 
    /// <summary>
    /// 每一个同事类都知道它的中介者对象。
    /// 每一个同事对象在与其他同事通讯的时候,与它的中介者通讯。
    /// </summary>
    public abstract class Colleague
    {
        protected Mediator m_mediator;
        public Colleague(Mediator mediator)
        {
            m_mediator = mediator;
        }
 
        public abstract void ValueChanged();
 
        public abstract void DisplayValue();
    }
 
    /// <summary>
    /// 具体同事1,实现Colleague接口。
    /// </summary>
    public class ConcreteColleague1:Colleague
    {
        private int m_value ;
        public ConcreteColleague1(Mediator mediator):base(mediator)
        {
            m_value = 'A';
        }
 
 
        public override void ValueChanged()
        {
            m_value++;
            m_mediator.Inform();
        }
 
        public override void DisplayValue()
        {
            Console.WriteLine("ConcreteColleague1:DisplayValue:" + m_value.ToString());
        }
    }
 
    /// <summary>
    /// 具体同事2,实现Colleague接口。
    /// </summary>
    public class ConcreteColleague2 : Colleague
    {
        private char m_value;
        public ConcreteColleague2(Mediator mediator)
            : base(mediator)
        {
            m_value = 'A';
        }
 
        public override void ValueChanged()
        {
            m_value++;
        }
 
 
        public override void DisplayValue()
        {
            Console.WriteLine("ConcreteColleague2:DisplayValue:" + m_value.ToString());
        }
    }
 
    /// <summary>
    /// 客户测试
    /// </summary>
    public class Client
    {
        public void Test()
        {
            Mediator mediator = new ConcreteMediator();
            Colleague colleague1 = new ConcreteColleague1(mediator);
            Colleague colleague2 = new ConcreteColleague2(mediator);
            mediator.SetColleagues(colleague1, colleague2);
            Console.WriteLine("Inital Value:");
            colleague1.DisplayValue();
            colleague2.DisplayValue();
 
            colleague1.ValueChanged();
            Console.WriteLine("colleague1.ValueChanged()");
             colleague1.DisplayValue();
             colleague2.DisplayValue();
 
        }
    }
 
}


 

你可能感兴趣的:(测试,Class,通讯)