zoukankan      html  css  js  c++  java
  • 訪问者模式的分析、结构图及基本代码

    

    之前我对全部的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);
                }
            }
        }
    }

  • 相关阅读:
    应用程序无法启动,因为应用程序的并行配置不正确
    dotnetcore发布报版本错误
    C# 间隔时间休眠
    windows程序崩溃生成dump文件
    C# 委托的使用
    C# winform程序开机自启的方法
    win10Ping端口和查看端口占用
    415 DOM 查找列表框、下拉菜单控件、对表格元素/表单控件进行增删改操作、创建元素并且复制节点与删除、 对表格操作、通用性和标准的事件监听方法(点击后弹窗效果以及去掉效果)
    413 重温HTML + css 考试 + 访问HTML元素
    412 6个题 BOM and DOM 定义计数器 网页跳转 网页前进后退
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7375337.html
Copyright © 2011-2022 走看看