zoukankan      html  css  js  c++  java
  • 访问者模式(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

  • 相关阅读:
    Educational Codeforces Round 69 D E
    洛谷P2325 [SCOI2005]王室联邦
    洛谷P1494 [国家集训队]小Z的袜子
    洛谷P4514 上帝造题的七分钟
    POJ3321Apple Tree
    满血复活前的记录(持续更新ing)
    各位2019见
    LuoguP3338 [ZJOI2014]力
    Codeforces Round #478 Div2 975A 975B 975C 975D
    Codeforces Round #479 (Div. 3) 题解 977A 977B 977C 977D 977E 977F
  • 原文地址:https://www.cnblogs.com/suzixuan/p/7044752.html
Copyright © 2011-2022 走看看