• 三十.访问者模式


    访问者模式:

    Visitor:表示一个作用于某个对象结构中的各元素的操作。它使你可以在不改变元素的类的前提下定义作用于这些元素的新操作。

    知识点:

           访问者模式是所有模式中最复杂的一个。

           适用于数据结构相对稳定的系统(很少很少使用)。如人只有男人和女人

           它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。

    Demo1

           //状态抽象类

        abstract class Action

        {

           //得到男人的结论

           public abstract void GetManConclusion(Man concreteElementA);

           //得到女人的结论

           public abstract void GetWomanConclusion(Woman concretElementB);

        }

           //成功

        class Success:Action

        {

           public override void GetManConclusion(Man concreteElementA)

            {

               //{0}被{1}访问

               Console.WriteLine("{0}{1}时,背后多半有一个伟大的女人。",

                    concreteElementA.GetType().Name,this.GetType().Name);

           }

           public override void GetWomanConclusion(Woman concretElementB)

           {

                Console.WriteLine("{0}{1}时,背后多半有一个失败的男人。",

                    concretElementB.GetType().Name,this.GetType().Name);

           }

        }

       //失败

       //恋爱

       //其他例子

           //抽象类

        abstract class Person

        {

           //接受

           public abstract void Accept(Action visitor);//获得状态的对象

        }

       class Man:Person

        {

           public override void Accept(Action visitor)

           {

               visitor.GetManConclusion(this);

           }

        }

       class Woman : Person

        {

           public override void Accept(Action visitor)

           {

               visitor.GetWomanConclusion(this);

           }

        }

           //对象结构。用于对比男女在不同的状态

        class ObjectStructure

        {

           private IList<Person> elements=new List<Person>();

           //增加

           public void Attach(Person element)

            {

               elements.Add(element);

           }

           //移除

           public void Detach(Person element)

           {

               elements.Remove(element);

           }

           //查看显示

           public void Display(Action visitor)

           {

               foreach (Person e in elements)

               {

                    e.Accept(visitor);

               }

           }

        }

  • 相关阅读:
    var与dynamic
    SQL Server占用服务器内存过高
    SQL SERVER 2012/ 2014 分页,用 OFFSET,FETCH NEXT改写ROW_NUMBER的用法
    SQL Server 2012 OFFSET/FETCH NEXT分页示例
    Solr初始化源码分析-Solr初始化与启动
    (c#) 销毁资源和释放内存
    C#中 ThreadStart和ParameterizedThreadStart区别
    MongoDB的C#封装类
    mongo DB for C#
    C#操作MongoDB
  • 原文地址:https://www.cnblogs.com/yaoge/p/1815263.html
Copyright © 2020-2023  润新知