博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
訪问者模式的分析、结构图及基本代码
阅读量:6799 次
发布时间:2019-06-26

本文共 2309 字,大约阅读时间需要 7 分钟。



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

转载地址:http://jxuwl.baihongyu.com/

你可能感兴趣的文章
微软云数据库 Azure SQL DB Hyperscale如何实现超大规模存储和高可用?
查看>>
华为的汽车“攻势”
查看>>
超级账本HyperLedger初体验
查看>>
用基于模型和接口的T4来生成RESTful服务
查看>>
苹果裁撤自动驾驶项目员工200余人
查看>>
广深IT之行:传统模式与技术创新的融合
查看>>
「Android」 详细全面的基于vue2.0Weex接入过程(Android视角)
查看>>
关于CarbonData+Spark SQL的一些应用实践和调优经验分享
查看>>
我们究竟应不应该使用框架?
查看>>
敏捷的忠实拥护者David Hussman于8月18日去世
查看>>
W3C发布DRM作为推荐方案
查看>>
前端计划——Codewars的一些JavaScript题集
查看>>
红帽论坛北京站召开 设立亚太开放创新实验室
查看>>
Spark生态顶级项目汇总
查看>>
EF Core 2.1路线图:视图、GROUP BY和惰性加载
查看>>
NetBeans在Apache基金会取得的进展
查看>>
Netflix实时流处理平台Keystone介绍
查看>>
一文带你快速读懂.NET CLI
查看>>
深入探索JVM自动资源管理
查看>>
实现TeX的算法:回首编程技术的过去三十年
查看>>