如何使用Visitor Pattern C#在列表中找到唯一元素

时间:2018-08-04 02:12:14

标签: c#

请有人帮我。我正在学习“访客模式”,我想知道如何在具有访客模式的列表中找到唯一元素。

“我的代码:”

using System;
using System.Collections.Generic;

namespace DoFactory.GangOfFour.Visitor.Structural
{
  /// <summary>

  /// MainApp startup class for Structural 

  /// Visitor Design Pattern.

  /// </summary>

  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();
    }
  }

  /// <summary>

  /// The 'Visitor' abstract class

  /// </summary>

  abstract class Visitor

  {
    public abstract void VisitConcreteElementA(
      ConcreteElementA concreteElementA);
    public abstract void VisitConcreteElementB(
      ConcreteElementB concreteElementB);
  }

  /// <summary>

  /// A 'ConcreteVisitor' class

  /// </summary>

  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);
    }
  }

  /// <summary>

  /// A 'ConcreteVisitor' class

  /// </summary>

  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);
    }
  }

  /// <summary>

  /// The 'Element' abstract class

  /// </summary>

  abstract class Element

  {
    public abstract void Accept(Visitor visitor);
  }

  /// <summary>

  /// A 'ConcreteElement' class

  /// </summary>

  class ConcreteElementA : Element

  {
    public override void Accept(Visitor visitor)
    {
      visitor.VisitConcreteElementA(this);
    }

    public void OperationA()
    {
    }
  }

  /// <summary>

  /// A 'ConcreteElement' class

  /// </summary>

  class ConcreteElementB : Element

  {
    public override void Accept(Visitor visitor)
    {
      visitor.VisitConcreteElementB(this);
    }

    public void OperationB()
    {
    }
  }

  /// <summary>

  /// The 'ObjectStructure' class

  /// </summary>

  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) //here, finds all elements in _elements and show what 'visitor' visited
    {
      foreach (Element element in _elements)
      {
        element.Accept(visitor);
      }
    }
  }
}

所以...当我使用obg.Accept(visitor_here)时,我找到了所有元素,并且“ visitor”访问了_element中的所有元素并在屏幕上显示了

我需要的是...如何找到独特的元素?示例:如何仅查找ConcreteElementA并在屏幕上显示

  

ConcreteVisitor1访问的ConcreteElementA

???谢谢您的关注

0 个答案:

没有答案