返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >.Net行为型设计模式之访问者模式(Visitor)
  • 618
分享到

.Net行为型设计模式之访问者模式(Visitor)

2024-04-02 19:04:59 618人浏览 薄情痞子
摘要

目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、访问者模式的代码实现六、访问者模式的实现要点:(1)、访问者模式的主要优点有

一、动机(Motivate)

在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中做这样的更改,将会给子类带来很繁重的变更负担,甚至破坏原有设计。如何在不更改类层次结构的前提下,在运行时根据需要透明地为类层次结构上的各个类动态添加新的操作,从而避免上述问题?

二、意图(Intent)

表示一个作用于某对象结构中的各个元素的操作。它可以在不改变各元素的类的前提下定义作用于这些元素的新的操作。                                 ——《设计模式GoF

三、结构图(Structure)

四、模式的组成

可以看出,在访问者模式的结构图有以下角色:
(1)、抽象访问者角色(Vistor): 声明一个包括多个访问操作,多个操作针对多个具体节点角色(可以说有多少个具体节点角色就有多少访问操作),使得所有具体访问者必须实现的接口。
(2)、具体访问者角色(ConcreteVistor):实现抽象访问者角色中所有声明的接口,也可以说是实现对每个具体节点角色的新的操作。
(3)、抽象节点角色(Element):声明一个接受操作,接受一个访问者对象作为参数,如果有其他参数,可以在这个“接受操作”里在定义相关的参数。
(4)、具体节点角色(ConcreteElement):实现抽象元素所规定的接受操作。
(5)、结构对象角色(ObjectStructure):节点的容器,可以包含多个不同类或接口的容器。

五、访问者模式的代码实现

访问者这个模式在我们现实的编码生活中使用的并不是很多,我就直接贴代码,让大家看代码的结构吧。今天给大家两个代码实例,自己慢慢体会访问者吧。实现代码如下:

static void Main(string[] args)
{
    //如果想执行新增加的操作
    ShapeVisitor visitor = new CustomVisitor();
    AppStructure app = new AppStructure(visitor);

    Shape shape = new Rectangle();
    shape.Draw();//执行自己的操作
    app.Process(shape);//执行新的操作


    shape = new Circle();
    shape.Draw();//执行自己的操作
    app.Process(shape);//执行新的操作


    shape = new Line();
    shape.Draw();//执行自己的操作
    app.Process(shape);//执行新的操作

}

//抽象图形定义---相当于“抽象节点角色”Element
public abstract class Shape
{
    //画图形
    public abstract void Draw();
    //外界注入具体访问者
    public abstract void Accept(ShapeVisitor visitor);
}

//抽象访问者 Visitor
public abstract class ShapeVisitor
{
    public abstract void Visit(Rectangle shape);

    public abstract void Visit(Circle shape);

    public abstract void Visit(Line shape);

    //这里有一点要说:Visit方法的参数可以写成Shape吗?就是这样 Visit(Shape shape),当然可以,但是ShapeVisitor子类Visit方法就需要判断当前的Shape是什么类型,是Rectangle类型,是Circle类型,或者是Line类型。
}

//具体访问者 ConcreteVisitor
public sealed class CustomVisitor : ShapeVisitor
{
    //针对Rectangle对象
    public override void Visit(Rectangle shape)
    {
        Console.WriteLine("针对Rectangle新的操作!");
    }
    //针对Circle对象
    public override void Visit(Circle shape)
    {
        Console.WriteLine("针对Circle新的操作!");
    }
    //针对Line对象
    public override void Visit(Line shape)
    {
        Console.WriteLine("针对Line新的操作!");
    }
}

//矩形----相当于“具体节点角色” ConcreteElement
public sealed class Rectangle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("矩形我已经画好!");
    }

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

//圆形---相当于“具体节点角色”ConcreteElement
public sealed class Circle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("圆形我已经画好!");
    }

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

//直线---相当于“具体节点角色” ConcreteElement
public sealed class Line : Shape
{
    public override void Draw()
    {
        Console.WriteLine("直线我已经画好!");
    }

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

//结构对象角色
internal class AppStructure
{
    private ShapeVisitor _visitor;

    public AppStructure(ShapeVisitor visitor)
    {
        this._visitor = visitor;
    }

    public void Process(Shape shape)
    {
        shape.Accept(_visitor);
    }
}

这是访问者模式第二种代码实例:

static void Main(string[] args)
{
    StoragePlatfORM platform = new StoragePlatform();
    platform.Attach(new Television());
    platform.Attach(new Computer());

    SizeVisitor sizeVisitor = new SizeVisitor();
    StateVisitor stateVisitor = new StateVisitor();

    platform.Operate(sizeVisitor);
    platform.Operate(stateVisitor);
}
//抽象访问者角色 Visitor
public abstract class Visitor
{
    public abstract void PutTelevision(Television tv);

    public abstract void PutComputer(Computer comp);
}

//具体访问者角色 ConcreteVisitor
public sealed 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);
    }
}

//具体访问者角色 ConcreteVisitor
public sealed 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);
    }
}

//抽象节点角色 Element
public 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; }
    }
}

//具体节点角色 ConcreteElement
public sealed class Television : Goods
{
    public override void Operate(Visitor visitor)
    {
        visitor.PutTelevision(this);
    }
}

//具体节点角色 ConcreteElement
public sealed class Computer : Goods
{
    public override void Operate(Visitor visitor)
    {
        visitor.PutComputer(this);
    }
}

//结构对象角色
public sealed class StoragePlatform
{
    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 g in list)
        {
            g.Operate(visitor);
        }
    }
}

六、访问者模式的实现要点:

Visitor模式通过所谓双重分发(double dispatch)来实现在不更改Element类层次结构的前提下,在运行时透明地为类层次结构上的各个类动态添加新的操作。所谓双重分发即Visitor模式中间包括了两个多态分发(注意其中的多态机制):第一个为accept方法的多态辨析;第二个为visit方法的多态辨析。
设计模式其实是一种堵漏洞的方式,但是没有一种设计模式能够堵完所有的漏洞,即使是组合各种设计模式也是一样。每个设计模式都有漏洞,都有它们解决不了的情况或者变化。每一种设计模式都假定了某种变化,也假定了某种不变化。Visitor模式假定的就是操作变化,而Element类层次结构稳定。

(1)、访问者模式的主要优点有:

1】、访问者模式使得添加新的操作变得容易。如果一些操作依赖于一个复杂的结构对象的话,那么一般而言,添加新的操作会变得很复杂。而使用访问者模式,增加新的操作就意味着添加一个新的访问者类。因此,使得添加新的操作变得容易。
2】、访问者模式使得有关的行为操作集中到一个访问者对象中,而不是分散到一个个的元素类中。这点类似与”中介者模式”。
3】、访问者模式可以访问属于不同的等级结构的成员对象,而迭代只能访问属于同一个等级结构的成员对象。

(2)、访问者模式的主要缺点有:

增加新的元素类变得困难。每增加一个新的元素意味着要在抽象访问者角色中增加一个新的抽象操作,并在每一个具体访问者类中添加相应的具体操作。具体来说,Visitor模式的最大缺点在于扩展类层次结构(增添新的Element子类),会导致Visitor类的改变。因此Visitor模式适用于“Element类层次结构稳定,而其中的操作却经常面临频繁改动”。

(3)、在下面的情况下可以考虑使用访问者模式:

1】、如果系统有比较稳定的数据结构,而又有易于变化的算法时,此时可以考虑使用访问者模式。因为访问者模式使得算法操作的添加比较容易。
2】、如果一组类中,存在着相似的操作,为了避免出现大量重复的代码,可以考虑把重复的操作封装到访问者中。(当然也可以考虑使用抽象类了)
3】、如果一个对象存在着一些与本身对象不相干,或关系比较弱的操作时,为了避免操作污染这个对象,则可以考虑把这些操作封装到访问者对象中。

七、.NET 访问者模式的实现

在现在的Net框架里面,如果要想给现有的类增加新的方法,有了新的方式,那就是“扩展方法”,使用起来和实例方法是一样一样的,而且在Net框架里面,微软自己也写了很多的扩展方法给我们使用。我目前还没有学习到Net的框架类库里面有“访问者模式”实现,看来自己还需努力,革命尚未成功啊。

到此这篇关于.Net行为型设计模式之访问者模式(Visitor)的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: .Net行为型设计模式之访问者模式(Visitor)

本文链接: https://lsjlt.com/news/149826.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • .Net行为型设计模式之访问者模式(Visitor)
    目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、访问者模式的代码实现六、访问者模式的实现要点:(1)、访问者模式的主要优点有...
    99+
    2024-04-02
  • Python 设计模式行为型访问者模式
    目录一、访问者模式(Visitor Pattern)二、应用场景三、代码示例一、访问者模式(Visitor Pattern) 数据结构中保存着许多元素,当我们希望改变一种对元素的处理...
    99+
    2024-04-02
  • .Net行为型设计模式之观察者模式(Observer)
    目录一、动机(Motivate)二、意图(Intent)三、结构图四、模式的组成五、观察者模式的代码实现六、观察者模式的实现要点:1、观察者模式的优点:2、观察者模式的缺点:七、.N...
    99+
    2024-04-02
  • .Net行为型设计模式之中介者模式(Mediator)
    目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、中介者模式的代码实现六、中介者模式的实现要点:1、中介者模式的优点2、中介者...
    99+
    2024-04-02
  • .Net行为型设计模式之中介者模式怎么实现
    这篇文章主要介绍“.Net行为型设计模式之中介者模式怎么实现”,在日常操作中,相信很多人在.Net行为型设计模式之中介者模式怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”.Net行为型设计模式之中介者...
    99+
    2023-06-30
  • .Net行为型设计模式之命令模式(Command)
    目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、命令模式的代码实现六、命令模式的实现要点:1、命令模式的优点:2、命令模式的...
    99+
    2024-04-02
  • .Net行为型设计模式之状态模式(State)
    目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、状态模式的代码实现六、状态模式的实现要点:1、状态模式的优点2、状态模式的缺...
    99+
    2024-04-02
  • .Net行为型设计模式之策略模式(Stragety)
    目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、策略模式的代码实现六、策略模式的实现要点:1、策略模式的主要优点有:2、策略...
    99+
    2024-04-02
  • Java设计模式之访问者模式
    大多数情况下你不需要访问者模式,但当一旦需要访问者模式时,那就是真的需要它了,这是设计模式创始人的原话。可以看出应用场景比较少,但需要它的时候是不可或缺的,这篇文章就开始学习最后一个...
    99+
    2022-11-13
    Java 设计模式 访问者模式
  • .Net行为型设计模式之迭代器模式(Iterator)
    目录一、动机(Motivate)二、意图(Intent)三、结构图四、模式的组成五、迭代器模式的代码实现六、迭代器模式的实现要点:迭代器模式的优点:迭代器模式的缺点:迭代器模式的使用...
    99+
    2024-04-02
  • .Net行为型设计模式之职责链模式(ChainofResponsibility)
    目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、职责链模式的代码实现六、职责链模式的实现要点:1、职责链模式的主要优点有:2...
    99+
    2024-04-02
  • .Net行为型设计模式之解释器模式(Interpreter)
    目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、解释器模式的代码实现六、解释器模式的实现要点:1、解释器模式的主要优点有:2...
    99+
    2024-04-02
  • .Net行为型设计模式之备忘录模式(Memento)
    目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、备忘录模式的代码实现六、备忘录模式的实现要点:1、备忘录模式的主要优点有:2...
    99+
    2024-04-02
  • .Net行为型设计模式之模板方法模式(Template Method)
    目录一、动机(Motivate)二、意图(Intent)三、结构图四、模式的组成五、模板方法模式的具体实现六、模板方法模式的实现要点:1、模板方法模式适用情形:2、模板方法模式特点:...
    99+
    2024-04-02
  • Python设计模式行为型观察者模式
    目录一、观察者模式二、应用场景三、代码示例一、观察者模式 观察者模式,必须包含 “观察者” 和 “被观察者” 这两个角色,并且观察者和...
    99+
    2024-04-02
  • .Net行为型设计模式之状态模式怎么实现
    这篇文章主要介绍“.Net行为型设计模式之状态模式怎么实现”,在日常操作中,相信很多人在.Net行为型设计模式之状态模式怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”.Net行为型设计模式之状态模式怎...
    99+
    2023-06-30
  • Java设计模式之java访问者模式详解
    目录介绍定义及使用场景UML类图角色财务案例个人心得体会静态分派以及动态分派静态分派动态分派访问者模式中的伪动态双分派 对访问者模式的一些思考总结优点缺点适用性参考文章总结介绍 ...
    99+
    2024-04-02
  • .Net行为型设计模式之解释器模式怎么实现
    这篇文章主要讲解了“.Net行为型设计模式之解释器模式怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“.Net行为型设计模式之解释器模式怎么实现”吧!一、动机(Motivate)在软件...
    99+
    2023-06-30
  • .Net行为型设计模式之备忘录模式怎么实现
    这篇文章主要讲解了“.Net行为型设计模式之备忘录模式怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“.Net行为型设计模式之备忘录模式怎么实现”吧!一、动机(Motivate)我们看...
    99+
    2023-06-30
  • 轻松掌握python设计模式之访问者模式
    本文实例为大家分享了python访问者模式代码,供大家参考,具体内容如下 """访问者模式""" class Node(object): pass class A(Node): pass c...
    99+
    2022-06-04
    模式 访问者 轻松
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作