• 中介者模式


    定义:用一个中介对象来封装一系列的对象交互,用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。多个对象可以互相通信,建立一个中间的中介类完成彼此间的通信,类似于QQ功能,链接多个类似的对象。

    优点:

    1、降低了类的复杂度,将一对多转化成了一对一。

    2、各个类之间的解耦。

    3、符合迪米特原则。


    使用前:

    使用后:

    缺点:中介者会庞大,变得复杂难以维护。

    实现:以下案例建立一个类似于QQ的功能。单个对象通过QQMeditor于其他对象通信。

    1.创建单个的对象的抽象类和实现类:

    public abstract class Colleage
    {
        private string _name;
        private string _content;
        public Colleage(string n) { _name = n; }
        public string Name
        {
            get {  return _name;}
            set { _name = value; }
        }
    
        public string Content
        {
            get { return _content;}
            set{  _content = value; }
        }
        public virtual void Talk(){}
    }
    
    public class ColleageA : Colleage
    {
        public ColleageA(string name): base(name){ }
        public override void Talk()
        {
            base.Talk();
            Debug.Log("ColleageA说: " + Content);
        }
    }   
                                                                               
    public class ColleageB : Colleage
    {
        public ColleageB(string name) : base(name) { }
        public override void Talk()
        {
            base.Talk();
            Debug.Log("ColleageB说: " + Content);
        }
    }
    
    public class ColleageC : Colleage
    {
        public ColleageC(string name) : base(name) { }
        public override void Talk()
        {
            base.Talk();
            Debug.Log("ColleageC说: " + Content);
        }
    }

    2.创建中介类的抽象类和实现类:

    public abstract class Meaditor
    {
        protected List<Colleage> Colleages = new List<Colleage>();
        public virtual void AddColleage(Colleage c){}
        public virtual void RemoveColleage(Colleage c){}
        public  virtual void Notify(Colleage student){}
        public virtual void Chart(Colleage A, Colleage B){}
    }
    
    public class QQMeaditor:Meaditor
    {
        public override void AddColleage(Colleage c)
        {
            Colleages.Add(c);
        }
    
        public override void RemoveColleage(Colleage c)
        {
            Colleages.Remove(c);
        }
    
        public override void Notify(Colleage student)
        {
            int count = Colleages.Count;
            for (int i = 0; i < count; i++)
            {
                Colleages[i].Talk();
            }
        }
    
        public override void Chart(Colleage A, Colleage B)
        {
            A.Talk();
            B.Talk();
        }
    }

    3.创建客户端类,实现具体调用:

    public class Client:MonoBehaviour
    {  
        void Start()
        {
        //创建单个对象和中介对象QQ
            QQMeditor qq = new QQMeditor();
            ColleageA a = new ColleageA("A");
            ColleageB b = new ColleageB("B");
            ColleageB c = new ColleageB("C");
    
            a.Content = "加油!";
            b.Content = "-----";
            c.Content = "=====";
        //添加多个对象进管理数组
    
            qq.AddColleage(a);
            qq.AddColleage(b);
            qq.AddColleage(c);
    
            qq.Notify(a);
            b.Content = "_________";
            c.Content = "+++++++++";
            qq.Chart(b, c);
        }
    }
    一直想把之前工作、学习时记录的文档整理到博客上,一方面温故而知新,一方面和大家一起学习 -程序小白
  • 相关阅读:
    BZOJ.1468.Tree(点分治)
    BZOJ.1935.[SHOI2007]Tree园丁的烦恼(CDQ分治 三维偏序)
    BZOJ.4319.[cerc2008]Suffix reconstruction(后缀数组 构造 贪心)
    BZOJ.3262.陌上花开([模板]CDQ分治 三维偏序)
    洛谷.3374.[模板]树状数组1(CDQ分治)
    BZOJ.4566.[HAOI2016]找相同字符(后缀数组 单调栈)
    POJ.3145.Common Substrings(后缀数组 倍增 单调栈)
    POJ.2774.Long Long Message/SPOJ.1811.LCS(后缀数组 倍增)
    POJ.1743.Musical Theme(后缀数组 倍增 二分 / 后缀自动机)
    UOJ.35.[模板]后缀排序(后缀数组 倍增)
  • 原文地址:https://www.cnblogs.com/wang-jin-fu/p/8321009.html
Copyright © 2020-2023  润新知