zoukankan      html  css  js  c++  java
  • 访问者模式(Visitor Pattern)

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

      using System;
       using ObjectStructure;
     
         // Visitor Pattern - Example    Judith Bishop October 2007
         // Sets up an object structure and visits it 
         // in two ways - for printing and for collecting elements in groups
         // using dynamic-dispatch
        
       namespace ObjectStructure {
        
         abstract class IElement {
           // Added to make Elements Visitor-ready
           public abstract void Accept(IVisitor visitor);
         }
     
         class Element : IElement {
           public Element Next {get; set;}
           public Element Link {get; set;}
           public Element () {}
           public Element (Element next) {
             Next = next;
           }
           public override void Accept(IVisitor visitor) {
             visitor.Visit(this);
           }
         }
       
         class ElementWithLink : Element {
           public ElementWithLink (Element link, Element next) {
             Next = next; 
             Link = link;
           }
           public override void Accept(IVisitor visitor) {
             visitor.Visit(this);
           }
         }
       } // end ObjectStructure
       
         // Visitor interface 
         interface IVisitor {
           void Visit (Element element);
           void Visit (ElementWithLink element);
         }
     
         // Visitor
         class CountVisitor : IVisitor {
         
         public int Count {get; set;}
         
         public void CountElements(Element element) {
           element.Accept(this);
           if (element.Link!=null) CountElements(element.Link);
           if (element.Next!=null) CountElements(element.Next);
         } 
         
         // Elements with links are not counted
         public void Visit(ElementWithLink element) {
            Console.WriteLine("Not counting");
         }
         
         // Only Elements are counted
         public void Visit (Element element) {
           Count++;
         }
       }
     
       // Client
       class Client {
         
         static void Main() {
           // Set up the object structure
           Element objectStructure = 
             new Element(
                 new Element(
                 new ElementWithLink(
                  new Element(           
                        new Element(  
                          new ElementWithLink(
                      new Element(null),        
                        new Element(
                        null)))),
             new Element(
                 new Element(
                 new Element(null))))));
     
           Console.WriteLine ("Count the Elements");
           CountVisitor visitor = new CountVisitor();
           visitor.CountElements(objectStructure);
           Console.WriteLine("Number of Elements is: "+visitor.Count);
           Console.ReadKey();
         }
       }
     /*
     Count the As
     Found Element
     Found Element
     Number of elements is: 9
     */
     
     
     
  • 相关阅读:
    Linux操作系统基本操作(1)
    C#: 获取当前路径不要用Environment.CurrentDirectory
    Python:Selenium Chrome无弹窗+property/attribute/text
    Python:Selenium+Webdriver安装
    Redis开启远程登录连接
    Redis Error:/var/redis/run/redis_6379.pid exists, process is already running or crashed
    Oracle VM VirtualBox虚拟机内Linux系统硬盘扩容步骤(CentOS6.5)
    PHP开发中Redis安装(CentOS6.5)
    MySQL创建用户与授权(CentOS6.5)
    CentOS下二进制包/源码安装方式的MySQL卸载步骤
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1809598.html
Copyright © 2011-2022 走看看