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
     */
     
     
     
  • 相关阅读:
    进程间通迅之消息队列
    进程间通讯之共享内存
    标准块CP功能实现
    标准字符cp功能
    文件cp功能
    jest 的 coverage 提示 unknown 的解决方案
    js中的相等
    getBoundingClientRect 和 requestAnimFrame 的polyfill
    设计模式(4): 给组件实现单独的store
    Vue项目移动端滚动穿透问题
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1809598.html
Copyright © 2011-2022 走看看