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

  • 相关阅读:
    常用的16个Java实用工具类,Java开发人员请收藏!
    JVM内存区域与垃圾回收
    听说你还不知道Java代码是怎么运行的?
    Java 到底是值传递还是引用传递?
    Java线程池实现原理及其在美团业务中的实践
    别再说Java对象都是在堆内存上分配空间的了!
    面试常问的Java虚拟机内存模型,看这篇就够了!
    好用的Java工具类库,GitHub星标10k+你在用吗?
    MySQL 全文索引实现一个简单版搜索引擎
    laravel 数据库里的图片重命名
  • 原文地址:https://www.cnblogs.com/suzixuan/p/7044752.html
Copyright © 2011-2022 走看看