visitor模式

coffee_mate5 2009-06-28 12:27:16
我想问一下,如下这样的代码,算不算visitor模式呢,跟常规的visitor模式(同一个Visitor子类重载了所有Element子类的visit方面)相比,互相的优劣性怎样,哈!

public abstract class Shape{
public abstract void Accept(Visitor v);
}

public class Rectangle : Shape{
pubic override void Accept(Visitor v);
}

public class Circle: Shape{
pubic override void Accept(Visitor v);
}

public abstract class Visitor{
public abstract void Visit(Shape s);
}

public class RectangleVisitor : Visitor{
public override void Visit(Shape s){
Rectangle obj = (Rectangle) s;
//do something on obj
}
}

public class CircleVisitor : Visitor{
public override void Visit(Shape s){
Circle obj = (Circle) s;
//do something on obj
}
}


public class App{
public static void main(){
Rectangle shape = new Rectangle();
RectangleVisitor visitor1 = new RectangleVisitor();
shape.Accept(visitor1);

Circle shape = new Rectangle();
CircleVisitor visitor2 = new CircleVisitor();
shape.Accept(visitor2);
}
}
...全文
99 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
发明了一系列雷人的模式来默认过去在c、c++中使用函数指针动态传递的功能 --> 发明了一系列雷人的模式来模拟过去在c、c++中使用函数指针动态传递的功能
  • 打赏
  • 举报
回复
单看你的代码,可能是因为没有体现出你的设计意图的原因,其实是毫无意义的。

早期的java语言,是因为它貌似解决了c、c++中非常严重的容易导致“野指针、内存泄漏”等问题而火起来的。但是早期的java非常简陋和愚蠢,于是设计模式作者发明了一系列雷人的模式来默认过去在c、c++中使用函数指针动态传递的功能。

在.net技术中,有很多清晰明了的delegate方法,例如你可以在 Shape 父类中定义 public event 来向任何关心 Shap 实例的客户对象通知某个事件,一句话就清晰地搞定了这个设计,而不需要什么 Visitor,不需要什么观察者,不需要搞什么雷人的“模式”。
  • 打赏
  • 举报
回复
例如,你的代码就可以使用更加专注.net的技术方式随便写为:
using System;

namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var shape = new Rectangle();
shape.Hi += new EventHandler<EventArgs>(shape_Hi);
shape.Alert();
shape = new Rectangle();
shape.Hi += new EventHandler<EventArgs>(Other.Other_Hi);
shape.Alert();
}

static void shape_Hi(object sender, EventArgs e)
{
Console.WriteLine("Shape_Hi");
}
}

public class Shape
{
public event EventHandler<EventArgs> Hi;

public void Alert()
{
if (this.Hi != null)
Hi(this, EventArgs.Empty);
}
}

public class Rectangle : Shape
{
}

public class Circle : Shape
{
}

public class Other
{
public static void Other_Hi(object sender, EventArgs e)
{
Console.WriteLine("Other_Hi");
}
}

}

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧