• 访问者模式(Visitor)


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

    访问者模式适用于数据结构相对稳定的系统。它吧数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。

    访问者模式的目的是要把处理从数据结构中分离出来。有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的。因为访问者模式使得算法操作的增加变的容易。

    它的优点是增加新的操作很容易,因为增加新的操作意味着增加一个新的访问者。访问这模式将有关的行为集中到一个访问者对象中。缺点是增加新的数据机构变的困难了。

    // Visitor pattern 
    // Structural example 
    using System;
    using System.Collections.Generic;
      
    namespace DoFactory.GangOfFour.Visitor.Structural
    {
        // MainApp test application
        class MainApp
        {
            static void Main()
            {
                // Setup structure
                ObjectStructure o = new ObjectStructure();
                o.Attach(new ConcreteElementA());
                o.Attach(new ConcreteElementB());
      
                // Create visitor objects
                ConcreteVisitor1 v1 = new ConcreteVisitor1();
                ConcreteVisitor2 v2 = new ConcreteVisitor2();
      
                // Structure accepting visitors
                o.Accept(v1);
                o.Accept(v2);
      
                // Wait for user
                Console.ReadKey();
            }
        }
      
        // "Visitor"
        abstract class Visitor
        {
            public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA);
            public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB);
        }
      
        // "ConcreteVisitor"
        class ConcreteVisitor1 : Visitor
        {
            public override void VisitConcreteElementA(ConcreteElementA concreteElementA)
            {
                Console.WriteLine("{0} visited by {1}",concreteElementA.GetType().Name, this.GetType().Name);
            }
      
            public override void VisitConcreteElementB(ConcreteElementB concreteElementB)
            {
                Console.WriteLine("{0} visited by {1}",concreteElementB.GetType().Name, this.GetType().Name);
            }
        }
      
        // "ConcreteVisitor"
        class ConcreteVisitor2 : Visitor
        {
            public override void VisitConcreteElementA(ConcreteElementA concreteElementA)
            {
                Console.WriteLine("{0} visited by {1}", concreteElementA.GetType().Name, this.GetType().Name);
            }
      
            public override void VisitConcreteElementB(ConcreteElementB concreteElementB)
            {
                Console.WriteLine("{0} visited by {1}", concreteElementB.GetType().Name, this.GetType().Name);
            }
        }
      
        // "Element"
        abstract class Element
        {
            public abstract void Accept(Visitor visitor);
        }
      
        // "ConcreteElement"
        class ConcreteElementA : Element
        {
            public override void Accept(Visitor visitor)
            {
                visitor.VisitConcreteElementA(this);
            }
      
            public void OperationA()
            {
            }
        }
      
        // "ConcreteElement"
        class ConcreteElementB : Element
        {
            public override void Accept(Visitor visitor)
            {
                visitor.VisitConcreteElementB(this);
            }
      
            public void OperationB()
            {
            }
        }
      
        // "ObjectStructure"
        class ObjectStructure
        {
            private List<Element> _elements = new List<Element>();
      
            public void Attach(Element element)
            {
                _elements.Add(element);
            }
      
            public void Detach(Element element)
            {
                _elements.Remove(element);
            }
      
            public void Accept(Visitor visitor)
            {
                foreach (Element element in _elements)
                {
                    element.Accept(visitor);
                }
            }
        }
    }

    http://www.cnblogs.com/lsxqw2004/p/4699616.html

  • 相关阅读:
    API Hook完全手册
    ASP.NET页面刷新的实现方法
    ASP.NET验证码
    ASP.NET优化性能的方法
    Asp.net中Server.Transfer,Server.Execute和Response.Redirect的区别
    FireFox新标签页打开搜索和书签
    win10里如何在中文输入法里添加美式键盘
    Sublime Text 3中文乱码问题解决
    Win2008 r2 IIS7.5出现“FastCGI进程最近常常失败。请过一会再尝试此请求”的解决方法
    Sublime Text 3中设置不记住上次打开的文件
  • 原文地址:https://www.cnblogs.com/suzixuan/p/7044752.html
Copyright © 2020-2023  润新知