惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
V
Visual Studio Blog
有赞技术团队
有赞技术团队
T
Tailwind CSS Blog
B
Blog
I
InfoQ
博客园 - 三生石上(FineUI控件)
阮一峰的网络日志
阮一峰的网络日志
F
Fortinet All Blogs
H
Help Net Security
博客园 - Franky
宝玉的分享
宝玉的分享
博客园 - 司徒正美
C
Check Point Blog
G
Google Developers Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Jina AI
Jina AI
T
The Blog of Author Tim Ferriss
MongoDB | Blog
MongoDB | Blog
云风的 BLOG
云风的 BLOG
A
About on SuperTechFans
罗磊的独立博客
大猫的无限游戏
大猫的无限游戏
IT之家
IT之家

博客园 - Charly

我的电影记录 再去听他的演唱会 学友12月29日广州演唱会 张学友十大粤语&十大国语金曲赏析 妈妈的第二次重生 随便谈谈最近参与的2个项目 中奖的幸运与不幸 设计模式学习笔记二十五——总结 Moss2007搜索服务配置,没有索引器和搜索配置页面报错问题解决 设计模式学习笔记二十三——TemplateMethod模式 设计模式学习笔记二十二——Strategy模式 设计模式学习笔记二十一——State模式 设计模式学习笔记二十——Memento模式 设计模式学习笔记十九——Observer模式 在MOSS 2007中调试WebPart 设计模式学习笔记十八——Mediator模式 设计模式学习笔记十七——Iterator模式 设计模式学习笔记十六——Interpreter模式 设计模式学习笔记十五——Command模式
设计模式学习笔记二十四——Visitor模式
Charly · 2007-09-01 · via 博客园 - Charly

动机:表示一个作用于某对象结构中的各元素的操作。它可以在不改变各元素的类的前提下定义作用于这些元素的新的操作。

场景:图形系统,假设其图像种类稳定,而其可提供的操作变化。

结构
Visitor模式结构图

代码

namespace DesignPattern.Visitor
{
    
public abstract class Shape
    
{
        
public abstract void Draw();

        
// 第二次分发
        public abstract void Accept(ShapeVisitor visitor);
    }


    
public class Rectangle : Shape
    
{
        
public override void Draw()
        
{
        }


        
public override void Accept(ShapeVisitor visitor)
        
{
            visitor.Visit(
this);
        }

    }


    
public class Circle : Shape
    
{
        
public override void Draw()
        
{
        }


        
public override void Accept(ShapeVisitor visitor)
        
{
            visitor.Visit(
this);
        }

    }


    
public class Line : Shape
    
{
        
public override void Draw()
        
{
        }


        
public override void Accept(ShapeVisitor visitor)
        
{
            visitor.Visit(
this);
        }

    }

}

namespace DesignPattern.Visitor
{
    
public abstract class ShapeVisitor
    
{
        
public abstract void Visit(Rectangle rectangle);
        
public abstract void Visit(Circle circle);
        
public abstract void Visit(Line line);
    }


    
public class ScaleVisitor : ShapeVisitor
    
{
        
public override void Visit(Rectangle rectangle)
        
{
        }


        
public override void Visit(Circle circle)
        
{
        }


        
public override void Visit(Line line)
        
{
        }

    }


    
public class MoveVisitor : ShapeVisitor
    
{
        
public override void Visit(Rectangle rectangle)
        
{
        }


        
public override void Visit(Circle circle)
        
{
        }


        
public override void Visit(Line line)
        
{
        }

    }

}

namespace DesignPattern.Visitor
{
    
public class Application
    
{
        ShapeVisitor visitor;

        
public Application(ShapeVisitor visitor)
        
{
            
this.visitor = visitor;
        }


        
public void Process(Shape shape)
        
{
            shape.Accept(visitor);
// 第一次分发
        }

    }

}

要点
        1、本模式通过所谓双重分发来实现在不更改Element类层次结构的前提下,在运行时透明地为类层次结构上的各个类动态添加新的操作。
        2、所谓双重分发即本模式中包含两个多态分发,第一个为Accept方法的多态辨析,第二个为Visit方法的多态辨析。
        3、本模式最大的缺点在于扩展类层次结构(增加新的Element子类),会导致Visitor类的改变。因此本模式适用于“Element类层次结构稳定,而其中的操作却面临频繁变动”。