码迷,mamicode.com
首页 > 其他好文 > 详细

行为型模式(六)中介者模式

时间:2015-11-30 23:55:03      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

 

一句话的概要

 定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显示低相互引用。降低耦合度,并且可以独立改变他们的交互行为。

剧情

小明和女神今天做了一个非常有意义的事情。他们俩在一个房间里,剪刀石头布,并且还赌钱。

小明赢了的话,十块钱。女神赢了的话,五块钱。

这个时候,我们就要结合一下设计模式了。

首先,我们用观察者模式,让小明和女神加入到这个游戏中。

接着,我们用状态模式,来分别创建小明赢和女神赢的情况。

最后,我们用中介者模式关联这两个对象。

任务一:创建玩家

我们来创建玩家这个抽象类。首先玩家肯定得有钱才能玩,那么我们构造函数把有多少钱传进去。

接着我们定义一个修改钱的方法,把钱数和中介者类传进来。

public abstract class AbstractPlayer
    {
        public int Money { get; set; }

        public AbstractPlayer()
        {
            Money = 0;
        }

        public abstract void Change(int count, AbstractMediator mediator);
    }

我们接下来,定义小明和女神这两个人。并且让他们实现抽象类。并且在修改钱的方法的时候,让中介者去操作这些钱。

public class SomgM : AbstractPlayer
    {
        public override void Change(int count, AbstractMediator mediator)
        {
            mediator.Change(count);
        }
    }

    public class NvShen : AbstractPlayer
    {
        public override void Change(int count, AbstractMediator mediator)
        {
            mediator.Change(count);
        }
    }

任务二:创建中介者

我们来创建中介者,让他关联状态和玩家类。

//创建中介者来管理玩家和玩家的钱
    public abstract class AbstractMediator
    {
        public List<AbstractPlayer> list = new List<AbstractPlayer>();
        public State State { get; set; }

        public AbstractMediator(State state)
        {
            this.State = state;
        }

        public void Change(int Count)
        {
            State.Change(Count);
        }

        public void Enter(AbstractPlayer partner)
        {
            list.Add(partner);
        }
    }

    public class MediatorPater : AbstractMediator
    {
        public MediatorPater(State initState) : base(initState)
        {
            Console.WriteLine("中介者创建完毕,可以对钱进行操作了");
        }
    }

这里我们,Change方法,直接调用状态的方法。Enter方法用来添加玩家。

任务三:创建状态类

 我们来创建状态类,状态一共有三种,赢,输,平局。我们先抽象一个方法,并且实现这三种状态。

 //创建状态类
    public abstract class State
    {
        protected AbstractMediator mediator;

        public abstract void Change(int Count);
    }

    //小明赢
    public class AWin : State
    {
        public AWin(AbstractMediator abMedia)
        {
            this.mediator = abMedia;
        }

        public override void Change(int Count)
        {
            foreach (AbstractPlayer p in mediator.list)
            {
                SomgM m = p as SomgM;
                if (m != null)
                    m.Money += Count;
                else
                    p.Money -= Count;
            }
        }
    }

    //女神赢
    public class BWin : State
    {
        public BWin(AbstractMediator abMedia)
        {
            this.mediator = abMedia;
        }

        public override void Change(int Count)
        {
            foreach (AbstractPlayer p in mediator.list)
            {
                NvShen n = p as NvShen;
                if (n != null)
                    n.Money += Count;
                else
                    p.Money -= Count;
            }
        }
    }

    //平局
    public class Init : State
    {
        public Init()
        {
            Console.WriteLine("平局");
        }

        public override void Change(int Count)
        {
            return;
        }
    }

主要就是状态初始化的时候,需要传中介者进去。

我们调用一下

private static void Main(string[] args)
        {
            //初始化
            AbstractPlayer someM = new SomgM();
            AbstractPlayer nvShen = new NvShen();
            //初始金钱
            someM.Money = 20;
            nvShen.Money = 20;
            //初始中介者,初始平局状态
            AbstractMediator mediator = new MediatorPater(new Init());
            //女神和小明,加入游戏
            mediator.Enter(someM);
            mediator.Enter(nvShen);
            //小明赢了
            mediator.State = new AWin(mediator);
            mediator.Change(10);
            //女神赢了
            mediator.State = new BWin(mediator);
            mediator.Change(5);
            //双方的钱
            Console.WriteLine("小明 现在钱:{0}", someM.Money);
            Console.WriteLine("女神 现在钱:{0}", nvShen.Money);

            Console.ReadLine();
        }

技术分享

总结:

 主要就是封装了一系列对象之间的调用关系。使用中介者模式的话,双方不需要相互引用。从而降低耦合度。

常用场景:一个系列的对象交互关系十分复杂。

选择关键点:复杂的交互关系是否有共性可被中介者承担。

行为型模式(六)中介者模式

标签:

原文地址:http://www.cnblogs.com/chenxygx/p/5004450.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!