博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Net设计模式实例之访问者模式(Visitor Pattern)
阅读量:5156 次
发布时间:2019-06-13

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

一、访问者模式简介(Brief Introduction

表示一个作用于某对象结构中的元素操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作,它把数据结构和作用于结构上的操作之间的耦合性解脱开,使的操作结合可以相对自由地演化。优点是增加新的操作很容易,因为增加一个新的操作就意味着增加一个新的访问者,访问者模式将有关的行为集中到一个访问对象中。

二、解决的问题(What To Solve

       访问者模式的目的是要把处理从数据结构分离出来。如果系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式是个不错的选择,因为访问者模式使的算法操作的增加变的容易。相反,如果系统的数据结构不稳定,易于变化,则此系统就不适合使用访问者模式了。

三、访问者模式分析(Analysis

1、访问者模式结构

Visitor:为对象结构中Element的每一个子类声明一个Visitor操作。

ConcreteVisitor1ConcreteVisitor2:具体的访问者,实现父类Visitor的操作。每个操作实现算法的一部分,而该算法片段仍是对应与结构中对象的类。

ObjectStructure:枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素。

Element:定义一个Accept操作,它以一个访问者为参数。

ConcreteElementAConcreteElementB: 具体元素,实现父类Element的方法Accept

2、源代码

1、访问者抽象类Visitor

public abstract class Visitor

{

    public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA);

 

    public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB);

}

 

2、具体访问者ConcreteVisitor1ConcreteVisitor2

public class ConcreteVisitor1 : Visitor

{

 

    public override void VisitConcreteElementA(ConcreteElementA concreteElementA)

    {

        Console.WriteLine("{0}访问{1}",this.GetType().Name,concreteElementA.GetType().Name);

    }

 

    public override void VisitConcreteElementB(ConcreteElementB concreteElementB)

    {

        Console.WriteLine("{0}访问{1}", this.GetType().Name, concreteElementB.GetType().Name);

    }

}

 

public class ConcreteVisitor2 : Visitor

{

 

    public override void VisitConcreteElementA(ConcreteElementA concreteElementA)

    {

        Console.WriteLine("{0}访问{1}", this.GetType().Name, concreteElementA.GetType().Name);

    }

 

    public override void VisitConcreteElementB(ConcreteElementB concreteElementB)

    {

        Console.WriteLine("{0}访问{1}", this.GetType().Name, concreteElementB.GetType().Name);

    }

 

3、定义一个Accept操作,它以一个访问者为参数

public abstract class Element

{

    public abstract void Accept(Visitor visitor);

}

 

4、具体元素ConcreteElementAConcreteElementB

public class ConcreteElementA : Element

{

 

    public override void Accept(Visitor visitor)

    {

        visitor.VisitConcreteElementA(this);

    }

 

    public void OperationA()

    {

 

    }

}

 

public class ConcreteElementB : Element

{

 

    public override void Accept(Visitor visitor)

    {

        visitor.VisitConcreteElementB(this);

    }

 

    public void OperationB()

    {

 

    }

}

 

5、对象结构ObjectStructure

public class ObjectStructure

{

    IList<Element> elements=new List<Element>();

 

    public void Add(Element e)

    {

        elements.Add(e);

    }

 

    public void Remove(Element e)

    {

        elements.Remove(e);

    }

 

    public void Accept(Visitor visitor)

    {

        foreach (Element e in elements)

        {

            e.Accept(visitor);

        }

    }

}

 

5、客户端代码

static void Main(string[] args)

{

    ObjectStructure os = new ObjectStructure();

    os.Add(new ConcreteElementA());

    os.Add(new ConcreteElementB());

 

    ConcreteVisitor1 cv1 = new ConcreteVisitor1();

    ConcreteVisitor2 cv2 = new ConcreteVisitor2();

    os.Accept(cv1);

    os.Accept(cv2);

 

    Console.Read();

}

3、程序运行结果

四、总结(Summary

访问者模式表示一个作用于某对象结构中的个元素操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 访问者模式的目的是要把处理从数据结构分离出来

转载于:https://www.cnblogs.com/zhuawang/archive/2011/09/27/2192702.html

你可能感兴趣的文章
高并发编程
查看>>
(前端)html与css css 19、tab栏
查看>>
一起来学习.net core程序使用中介者模式:MediatR插件
查看>>
debian9 设置
查看>>
5句话搞定ES5作用域
查看>>
Build tool
查看>>
php 小坑记录
查看>>
2018.7.28 二叉树的遍历规则(前序遍历、后序遍历、中序遍历)
查看>>
通过 poi 导入 Excel代码
查看>>
《CSS基础教程》 读书笔记三
查看>>
洛谷P4482 [BJWC2018]Border 的四种求法 字符串,SAM,线段树合并,线段树,树链剖分,DSU on Tree...
查看>>
PHP安全新闻早8点_1127
查看>>
57.Insert Interval
查看>>
PHP 五大运行模式
查看>>
CSS选项卡
查看>>
HDOJ1203 I NEED A OFFER!
查看>>
ZH奶酪:自然语言处理工具LTP语言云调用方法
查看>>
.NET中将图片文件流转成Base64字符串的实现
查看>>
js如何操作或是更改sass里的变量
查看>>
BZOJ1419: Red is good
查看>>