Unity学习笔记:设计模式-Mediator(中介)

意图 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
适用性
  • 一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
  • 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
  • 想定制一个分布在多个类中的行为,而又不想生成太多的子类。

案例:(几个人打牌 输赢的计算)

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

namespace dp_Mediator
{
    public abstract class 抽象牌友
    {
        private int moneyCount=0;       
        public int MoneyCount { get; set; }
        public abstract void ChangeCount(int count,抽象中介 mediator);
     
    }
    public class 牌友A : 抽象牌友
    {
        public override void ChangeCount(int count, 抽象中介 mediator)
        {
            mediator.AWin(count);
        }
    }
    public class 牌友B : 抽象牌友
    {
        public override void ChangeCount(int count, 抽象中介 mediator)
        {
            mediator.BWin(count);
        }
    }


    public abstract class 抽象中介
    {
        protected 抽象牌友 Aobj;
        protected 抽象牌友 Bobj;
         public 抽象中介(抽象牌友 Aobj, 抽象牌友 Bobj)
        {
            this.Aobj = Aobj;
            this.Bobj = Bobj;
        }

        public int MoneyCount;      
    
        //abstract public void ChangeCount(int count,抽象牌友[] objs);

        public abstract void AWin(int count);
        public abstract void BWin(int count);
    }
    public class 具体中介 : 抽象中介
    {
        public 具体中介(抽象牌友 Aobj, 抽象牌友 Bobj) : base(Aobj,  Bobj) { }

        public override void AWin(int count)
        {
            Aobj.MoneyCount += count;
            Bobj.MoneyCount -= count;

        }
        public override void BWin(int count)
        {
            Bobj.MoneyCount += count;
            Aobj.MoneyCount -= count;
        }
        //public override void ChangeCount(int count, 抽象牌友[] objs)
        //{
        //    //标识=字段 赢字段  true objs[i].winbool=true;
        //    //if (objs[i].winbool) objs[i].moneycount += count;
        //    //else 

        //}
    }



      public class Client
    {
        static void Main()
        {
            //创建所有玩家
            抽象牌友 zs = new 牌友A();
            抽象牌友 ls = new 牌友B();
            //都要带钱
            zs.MoneyCount = 20;
            ls.MoneyCount = 20;
            抽象中介 ww = new 具体中介(zs, ls);
            ww.MoneyCount = 100;
            Console.WriteLine("玩之前--------");
            Console.WriteLine(zs.MoneyCount);
            Console.WriteLine(ls.MoneyCount);
            //zs赢了,大胡 5
            zs.ChangeCount(5, ww);
            
            Console.WriteLine("玩之后--------");
            Console.WriteLine(zs.MoneyCount);
            Console.WriteLine(ls.MoneyCount);

            Console.ReadLine();
        
        }


    }
}

猜你喜欢

转载自blog.csdn.net/huanyu0127/article/details/107829832