• 访问者模式(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

  • 相关阅读:
    [时间篇TIME]Learn with whole Life 一生的学习
    使用IIS内置压缩功能,增加网站访问速度
    CSS中A链接样式的 "爱恨"原则
    爱情六十三课,定个开放日
    给爱子的信
    在IE中使用高级CSS3选择器
    爱情六十七课,下台阶的学问
    网上常用免费WebServices集合
    美国狗证上的10句话
    爱情六十五课,情爱无智者
  • 原文地址:https://www.cnblogs.com/suzixuan/p/7044752.html
Copyright © 2020-2023  润新知