设计模式24——行为型模式之訪问者模式

简介:

定义:訪问者模式(Vistor Pattern),表示一个作用于对象结构中各元素的操作。它使你能够在不改变各元素的类的前提下定义作用于这些元素的新操作。

类型:对象行为型模式。

概述:

         訪问者模式适用的场合比較狭窄。由于它的要求很严。

ConcreteElement要求具有一样的算法接口,而且ConcreteVisitor也要求一样的接口。这两点就使得訪问者模式的使用范围比較窄。在《Head First Design Patterns》中也将訪问者模式列为很常使用模式之中的一个。

          举一个样例,有一个仓库(对象结构)。里面储存不同的电器(元素)。如电视、电脑(详细元素),仓库能够按电器新旧或大小(详细的訪问者)来摆放电器产品。

类图:


參与者:

  1. Client:构建抽象的訪问者以及结构体对象。

  1. Storage。详细生成并存储不同的商品(如TelevisionComputer)。

  1. Goods。抽象商品类。

  2. TelevisionComputer,详细的商品类,对对应的属性完毕赋值。

  1. Place,抽象的訪问者类。提供抽象訪问方法。
  1. StateSize。详细的訪问者类,依据对应商品属性来实现详细的摆放方法Put()

演示样例代码:

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

namespace Pattern24
{
    abstract class Visitor
    {
        public abstract void PutTelevision(Television tv);

        public abstract void PutComputer(Computer comp);
    }

    class SizeVisitor : Visitor
    {
        public override void PutTelevision(Television tv)
        {
            Console.WriteLine("按商品大小{0}排放", tv.Size);
        }

        public override void PutComputer(Computer comp)
        {
            Console.WriteLine("按商品大小{0}排放", comp.Size);
        }
    }

    class StateVisitor : Visitor
    {
        public override void PutTelevision(Television tv)
        {
            Console.WriteLine("按商品新旧值{0}排放", tv.State);
        }

        public override void PutComputer(Computer comp)
        {
            Console.WriteLine("按商品新旧值{0}排放", comp.State);
        }
    }

    abstract class Goods
    {
        public abstract void Operate(Visitor visitor);
        private int nSize;
        public int Size
        {
            get {return nSize;}
            set {nSize = value;}
        }
        private int nState;
        public int State
        {
            get {return nState;}
            set {nState = value;}
        }
     }

    class Television : Goods
    {
        public override void Operate(Visitor visitor)
        {
            visitor.PutTelevision(this);
        }
    }

    class Computer : Goods
    {
        public override void Operate(Visitor visitor)
        {
            visitor.PutComputer(this);
        }
    }

    class Storage
    {
        private IList<Goods> list = new List<Goods>();

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

        public void Detach(Goods element)
        {
            list.Remove(element);
        }

        public void Operate(Visitor visitor)
        {
            foreach (Goods e in list)
            {
                e.Operate(visitor);
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Storage storage = new Storage();
            storage.Attach(new Television());
            storage.Attach(new Computer());

            SizeVisitor v1 = new SizeVisitor();
            StateVisitor v2 = new StateVisitor();

            storage.Operate(v1);
            storage.Operate(v2);

            Console.Read();
        }
    }
}

适用性:

  1. 一个对象结构包括非常多类对象。它们有不同的接口。而你想对这些对象实施一些依赖于其详细类的操作。
  2. 须要对一个对象结构中的对象进行非常多不同的而且不相关的操作,而你想避免让这些操作“污染”这些对象的类。


     Visitor使得你能够将相关的操作集中起来定义在一个类中。
     
    当该对象结构被非常多应用共享时,用Visitor模式让每一个应用仅包括须要用到的操作。

  1. 定义对象结构的类非常少改变,但常常须要在此结构上定义新的操作。
     
    改变对象结构类须要重定义对全部訪问者的接口,这可能须要非常大的代价。


     
    假设对象结构类常常改变,那么可能还是在这些类中定义这些操作较好                

优缺点:

  1. 长处,完毕新的模板方法是不用改动原有代码,通过加入新代码完毕。
  1. 缺点,当使用訪问者模式时,打破了组合模式。






本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5420317.html,如需转载请自行联系原作者  
相关文章
|
19天前
|
设计模式 前端开发 搜索推荐
前端必须掌握的设计模式——模板模式
模板模式(Template Pattern)是一种行为型设计模式,父类定义固定流程和步骤顺序,子类通过继承并重写特定方法实现具体步骤。适用于具有固定结构或流程的场景,如组装汽车、包装礼物等。举例来说,公司年会节目征集时,蜘蛛侠定义了歌曲的四个步骤:前奏、主歌、副歌、结尾。金刚狼和绿巨人根据此模板设计各自的表演内容。通过抽象类定义通用逻辑,子类实现个性化行为,从而减少重复代码。模板模式还支持钩子方法,允许跳过某些步骤,增加灵活性。
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
4月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
25天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
2月前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
2月前
|
设计模式 安全 Java
Kotlin - 改良设计模式 - 构建者模式
Kotlin - 改良设计模式 - 构建者模式
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
51 1
|
3月前
|
设计模式 Java Kotlin
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。对于快速学习Kotlin语法,推荐查看“简洁”系列教程。本文重点介绍了构建者模式在Kotlin中的应用与改良,包括如何使用具名可选参数简化复杂对象的创建过程,以及如何在初始化代码块中对参数进行约束和校验。
39 3
|
3月前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
3月前
|
设计模式 JavaScript 前端开发
JavaScript设计模式--访问者模式
【10月更文挑战第1天】
43 3