• 訪问者模式的分析、结构图及基本代码


    

    之前我对全部的23种设计模式作了一个小总结。如今我们来对每一种设计模式作具体的分析。首先是訪问者模式:

    定义:表示一个作用于某对象结构中的各元素的操作。它可使你能够在不改变各元素的类的前提下定义作用于这些元素的新操作。
    适用地方:訪问者模式的目的是要把处理从数据结构分离出来。非常多系统能够依照算法和数据结构分开,假设这种系统有比較稳定的数据结构。又有易于变化的算法的话。使用訪问者模式就是比較合适的,由于訪问者模式使得算法操作的添加变得easy。
    优缺点:訪问者模式的长处就是添加新的操作非常easy,由于添加新的操作就意味着添加一个新的訪问者。

    缺点就是使添加新的数据结构变得困难了。


    结构图:


    基本代码:

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace 訪问者模式
    {
        class Program
        {
            static void Main(string[] args)
            {
                ObjectStructure o = new ObjectStructure();
                o.Attach(new ConcreteElementA());
                o.Attach(new ConcreteElementB());

                ConcreteVisitor1 v1 = new ConcreteVisitor1();
                ConcreteVisitor2 v2 = new ConcreteVisitor2();

                o.Accept(v1);
                o.Accept(v2);

                Console.Read();
            }
        }

        abstract class Visitor
        {
            public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA);

            public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB);
        }

        class ConcreteVisitor1 : Visitor
        {
            public override void VisitConcreteElementA(ConcreteElementA concreteElementA)
            {
                Console.WriteLine("{0}被{1}訪问", concreteElementA.GetType().Name, this.GetType().Name);
            }

            public override void VisitConcreteElementB(ConcreteElementB concreteElementB)
            {
                Console.WriteLine("{0}被{1}訪问", concreteElementB.GetType().Name, this.GetType().Name);
            }
        }

        class ConcreteVisitor2 : Visitor
        {
            public override void VisitConcreteElementA(ConcreteElementA concreteElementA)
            {
                Console.WriteLine("{0}被{1}訪问", concreteElementA.GetType().Name, this.GetType().Name);
            }

            public override void VisitConcreteElementB(ConcreteElementB concreteElementB)
            {
                Console.WriteLine("{0}被{1}訪问", concreteElementB.GetType().Name, this.GetType().Name);
            }
        }

        abstract class Element
        {
            public abstract void Accept(Visitor visitor);
        }

        class ConcreteElementA : Element
        {
            public override void Accept(Visitor visitor)
            {
                visitor.VisitConcreteElementA(this);
            }

            public void OperationA()
            { }
        }

        class ConcreteElementB : Element
        {
            public override void Accept(Visitor visitor)
            {
                visitor.VisitConcreteElementB(this);
            }

            public void OperationB()
            { }
        }

        class ObjectStructure
        {
            private IList<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 e in elements)
                {
                    e.Accept(visitor);
                }
            }
        }
    }

  • 相关阅读:
    HDU 6333.Problem B. Harvest of Apples-组合数C(n,0)到C(n,m)求和-组合数学(逆元)+莫队 ((2018 Multi-University Training Contest 4 1002))
    HDU 6330.Problem L. Visual Cube-模拟到上天-输出立方体 (2018 Multi-University Training Contest 3 1012)
    HDU 6326.Problem H. Monster Hunter-贪心(优先队列)+流水线排序+路径压缩、节点合并(并查集) (2018 Multi-University Training Contest 3 1008)
    杭电1518 Square(构成正方形) 搜索
    POJ1659 Frogs' Neighborhood(青蛙的邻居) Havel-Hakimi定理
    杭电1133 排队买票 catalan
    hdu 5945 Fxx and game 单调队列优化dp
    Codeforces Round #278 (Div. 2) D. Strip 线段树优化dp
    hdu 4348 To the moon 主席树区间更新
    hdu 4417 Super Mario 树状数组||主席树
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7375337.html
Copyright © 2020-2023  润新知