`

VisitorPattern

 
阅读更多

意图
表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作.

 

意图中的-->某对象结构:可以理解为集合,它们相当于一个聚集一样,里面可以放置多个元素,访问者模式作用于聚集中每一个元素的不同操作.

 

我们想修改某个对象的新操作必然要修改该对象定义的类,在类里面增加相应的方法,这样这个对象就具备了新的操作.访问者模式不需要修改这个对象对应的类就可以对该对象添加新的操作.

 

适用性:
1.一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作.

 

2.需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作"污染"这些对象的类.Visitor使得你可以将相关的操作集中起来定义在一个类中.当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作.

 

3.定义对象结构的类很少改变,但经常需要在此结构上定义新的操作.改变对象结构类需要重定义对搜有访问者的接口,这可能需要很大的代价.如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好.

构成:
1.抽象访问者(Visitor)角色:为对象结构类中每一个ConcreteElement的类声明一个visit操作.

2.具体访问者(ConcreteVisitor)角色:实现每个由Visitor声明的操作.

3.元素(Element)角色:定义一个Accept操作,它以一个访问者为参数.

4.具体元素(ConcreteElement)角色:实现Accept操作,该操作以一个访问者为参数.

5.对象结构类(ObjectStructure)角色(聚集角色):能枚举(遍历)它的元素.可以提供一个高层的接口以允许访问者访问它的元素.

ClassDiagram:

 

SequenceDiagram:

 

 class Client
    {
        static void Main(string[] args)
        {
            ObjectStructure o = new ObjectStructure();

            o.Attach(new ConcreteElementA());
            o.Attach(new ConcreteElementB());

            ConcreteVisitorA v1 = new ConcreteVisitorA();
            ConcreteVisitorB v2 = new ConcreteVisitorB();

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

            Console.ReadKey();
        }
    }

    /// <summary>
    /// 抽象访问者
    /// </summary>
    abstract class Visitor
    {
        public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA);

        public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB);
    }

    /// <summary>
    /// 元素角色
    /// </summary>
    abstract class Element
    {
        public abstract void Accept(Visitor visitor);
    }

    /// <summary>
    /// 具体元素角色A
    /// </summary>
    class ConcreteElementA : Element
    {
        public override void Accept(Visitor visitor)
        {
            visitor.VisitConcreteElementA(this);
        }
    }

    /// <summary>
    /// 具体元素角色B
    /// </summary>
    class ConcreteElementB : Element
    {
        public override void Accept(Visitor visitor)
        {
            visitor.VisitConcreteElementB(this);
        }
    }

    /// <summary>
    /// 具体访问者角色A
    /// </summary>
    class ConcreteVisitorA : 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>
    /// 具体访问者角色B
    /// </summary>
    class ConcreteVisitorB : 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>
    /// 对象结构类
    /// </summary>
    class ObjectStructure
    {
        private ArrayList list = new ArrayList();

        public void Attach(Element element)
        {
            list.Add(element);
        }

        public void Dettach(Element element)
        {
            list.Remove(element);
        }

        public void Accept(Visitor vsistor)
        {
            foreach (Element e in list)
            {
                e.Accept(vsistor);
            }
        }
    }

 

  • 大小: 84.1 KB
  • 大小: 84.9 KB
分享到:
评论

相关推荐

    visitor pattern

    **访客模式(Visitor Pattern)** 访客模式是一种行为设计模式,它允许在不修改对象结构的情况下,为对象增加新的操作。这种模式常用于将算法与数据结构分离,使得算法可以独立于数据结构进行变化。在软件开发中,当...

    访问者模式VisitorPattern

    **访问者模式(VisitorPattern)** 访问者模式是一种行为设计模式,它使你能在不修改对象结构的前提下向对象添加新的操作。这种模式常用于处理具有复杂逻辑的对象结构,特别是当你需要对这些对象进行多态操作时。访问...

    设计模式之访问者模式(Visitor Pattern)

    **访问者模式(Visitor Pattern)**是一种行为设计模式,它提供了一种在不修改对象结构的情况下增加新操作的方法。这种模式的主要思想是将数据结构与算法分离,使得算法可以在不改变对象结构的情况下独立变化。 在...

    访问者模式(VisitorPattern)

    访问者模式(VisitorPattern)是一种行为设计模式,其主要目的是为了在不改变数据结构的前提下,增加对元素集合的新操作。这种模式将操作封装在独立的访问者类中,使得操作和数据结构解耦,允许两者独立演进。 **...

    visitor-composite-patterns-combined:复合和访客设计模式示例

    **访客模式(Visitor Pattern)** 访客模式是一种行为设计模式,它让你能添加新的操作到对象结构中,而无需修改该结构的类。访客模式的核心是将数据结构与操作分离,使得增加新的操作变得容易。在访客模式中,一个代表...

    VisitorPattern:CS100 Lab8-使用Visitor模式和Iterator模式的操作数计数器的实现

    访客模式 作者:Brian ( ) 您必须一组两个一组地工作 迭代器类 您已经获得了四个文件,其中包含以下五个迭代器类的声明和定义: 迭代器:这是用于定义所有其他迭代器类的接口的基类 NullIterator:此迭代器由...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    1、策略模式STRATEGY PATTERN 2、代理模式PROXY PATTERN 3、单例模式SINGLETON PATTERN ...18、访问者模式VISITOR PATTERN 19、状态模式 20、原型模式 21、中介者模式 22、解释器模式 23、亨元模式 24、备忘录模式

    [行为型模式] 访问者模式的理解

    通常,`VisitorPattern.cpp`会包含具体访问者和元素的实现,而`VisitorPattern.h`则定义了相关的接口和类。通过阅读这些文件,我们可以了解到如何在C++中实际应用访问者模式来实现对对象结构的操作。 总结来说,...

    VisitorPattern:购物终端实施

    访客模式 购物终端实施 考虑一家商店,其中每件商品都有单位价格,也可能有批量价格。 例如,一个苹果可能是 1.00 美元,或者 4 个苹果是 3.00 美元。 实现一个销售点扫描 API,该 API 接受产品的任意订购(类似于...

    C#版 24种设计模式

    策略模式(Strategy Pattern) 抽象工厂模式(Abstract Factory Pattern) 代理模式(Proxy Pattern) 单例模式(Singleton Pattern) 迭代器模式(Iterator Pattern) 访问者模式(Visitor Pattern) 工厂方法模式(Factory ...

    ALittleJava:Visitor Pattern Understanding, 数据和行为

    [A little java笔记][1] Evaluate(interpret) all the hierarchy objects, apply coresponding operators to every objects. Introspect 和 retrospect具有类似的地方(review ,look back on, backcall) ...

    Visitor模式

    访问者模式(Visitor Pattern)是一种行为设计模式,它使你能在不修改对象结构的前提下,为对象添加新的操作。这种模式在处理具有复杂逻辑和多种类型的对象结构时特别有用,因为它允许你在不改变原有结构的情况下,...

    访问者模式(Visitor)原理图

    访问者模式(Visitor Pattern)是GoF提出的23种设计模式中的一种,属于行为模式。它表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。从定义可以看出,...

    C#设计模式_设计模式_C#_

    创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5.... 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)

    23种设计模式 (创建型,结构型,行为型)

    创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3.... 4.... 5.... 6. 适配器模式(Adapter Pattern) 7.... 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)

    用Java实现23种设计模式

    访问者模式(Visitor Pattern) 4. J2EE 模式 MVC 模式(MVC Pattern) 业务代表模式(Business Delegate Pattern) 数据访问对象模式(Dao Pattern) 前端控制器模式(Front Controller Pattern) 拦截过滤器...

    设计模式代码——c#

    C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式...22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)

    设计模式PPT

    创建型模式用来处理对象的创建过程,主要包含以下5种设计模式:  工厂方法模式(Factory Method Pattern)  抽象工厂模式(Abstract Factory Pattern)  建造者模式(Builder... 访问者模式(Visitor Pattern)

Global site tag (gtag.js) - Google Analytics