设计模式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,如需转载请自行联系原作者  
相关文章
|
10月前
|
设计模式 Java 数据库连接
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
296 16
|
10月前
|
设计模式 网络协议 Java
【设计模式】【行为型模式】状态模式(State)
一、入门 什么是状态模式? 状态模式(State Pattern)是一种行为设计模式,允许对象在其内部状态改变时改变其行为,使其看起来像是改变了类。状态模式的核心思想是将对象的状态封装成独立的类,并将
392 16
|
10月前
|
设计模式 算法 前端开发
【设计模式】【行为型模式】职责链模式(Chain of Responsibility)
一、入门 什么是职责链模式? 职责链模式是一种行为设计模式,它允许你将请求沿着一条链传递,直到有对象处理它为止。每个对象都有机会处理请求,或者将其传递给链中的下一个对象。 为什么需要职责链模式? 使用
363 16
|
10月前
|
设计模式 存储 Java
【设计模式】【行为型模式】备忘录模式(Memento)
一、入门 什么是备忘录模式? 备忘录模式(Memento Pattern)是一种行为设计模式,用于在不破坏封装性的前提下,捕获并外部化一个对象的内部状态,以便在需要时恢复该状态。它通常用于实现撤销操作
320 8
|
10月前
|
设计模式 负载均衡 监控
并发设计模式实战系列(2):领导者/追随者模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第二章领导者/追随者(Leader/Followers)模式,废话不多说直接开始~
288 0
|
10月前
|
设计模式 监控 Java
并发设计模式实战系列(1):半同步/半异步模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第一章半同步/半异步(Half-Sync/Half-Async)模式,废话不多说直接开始~
354 0
|
10月前
|
设计模式 安全 Java
并发设计模式实战系列(12):不变模式(Immutable Object)
🌟 大家好,我是摘星!🌟今天为大家带来的是并发设计模式实战系列,第十二章,废话不多说直接开始~
239 0
|
10月前
|
设计模式 算法 Java
设计模式觉醒系列(04)策略模式|简单工厂模式的升级版
本文介绍了简单工厂模式与策略模式的概念及其融合实践。简单工厂模式用于对象创建,通过隐藏实现细节简化代码;策略模式关注行为封装与切换,支持动态替换算法,增强灵活性。两者结合形成“策略工厂”,既简化对象创建又保持低耦合。文章通过支付案例演示了模式的应用,并强调实际开发中应根据需求选择合适的设计模式,避免生搬硬套。最后推荐了JVM调优、并发编程等技术专题,助力开发者提升技能。
|
10月前
|
设计模式 消息中间件 Java
【设计模式】【行为型模式】命令模式(Command)
一、入门 什么是命令模式? 命令模式是一种行为设计模式,它将请求或操作封装为对象,从而使你可以用不同的请求对客户进行参数化,并支持请求的排队、记录、撤销等操作。 命令模式的核心是将“请求”封装为独立的
285 15
|
10月前
|
设计模式 算法 搜索推荐
【设计模式】【行为型模式】策略模式(Strategy)
一、入门 什么是策略模式? 策略模式是一种行为设计模式,允许在运行时选择算法或行为。它将算法封装在独立的类中,使得它们可以互换,而不影响客户端代码。 为什么需要策略模式? 策略模式的主要目的是解决算法
216 14