您的位置:首页 > 其它

设计模式学习19 Visitor

2010-07-24 19:51 399 查看

应用场景:

在软件构建过程中,由于需求的变化,某些类层次常常需要新增加新的行为,如果直接改变基类的方法的话,将给子类的维护带来巨大的灾难。解决的思路是使用visitor模式,需要新增加方法的类是不需要改动的,只要实现相应的接口即可。这里是英文解释:

Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.

实现代码:

class Program
{
private ShapeVisitor  visitor;

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

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

static void Main(string[] args)
{
Program program = new Program(new MyVisitor());

// 两次的多态辨析
// 主对象:Accept方法的调用对象
// accept方法的参数visitor的多态辨析
program.Process(new Line());
}
}

public abstract class ShapeVisitor
{
// 重载,接受的参数是具体类型。

// 如果新的功能增加的话,这个类还是需要新增加类型。

public abstract void Visit(Rectangle rect);
public abstract void Visit(Circle circle);
public abstract void Visit(Line line);
}

public abstract class Shape
{
public abstract void Draw();

// 现在需要新增加一个函数(功能)
// 所有的子类都需要修改,否则子类是无法编译通过的。
public abstract void MoveTo(int posititon);

// 将来可能会引入新的操作
public abstract void Accept(ShapeVisitor v);

}

class Context
{

}

public class Rectangle : Shape
{

public override void Draw()
{
throw new NotImplementedException();
}

public override void MoveTo(int posititon)
{
throw new NotImplementedException();
}

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

public class Circle : Shape
{
public override void  Draw()
{
throw new NotImplementedException();
}

public override void  MoveTo(int posititon)
{
throw new NotImplementedException();
}

public override void Accept(ShapeVisitor v)
{
throw new NotImplementedException();
}
}

public class Line : Shape
{

public override void Draw()
{
throw new NotImplementedException();
}

public override void MoveTo(int posititon)
{
throw new NotImplementedException();
}

public override void Accept(ShapeVisitor v)
{
Console.WriteLine("public override void Accept(ShapeVisitor v)");

v.Visit(this);
}
}
class MyVisitor :ShapeVisitor
{

public override void Visit(Rectangle rect)
{
// 增加对 rectangle的操作
Console.WriteLine("这里是读rectangle类新增加的操作。");
}

public override void Visit(Circle circle)
{

}

public override void Visit(Line line)
{
Console.WriteLine("这里是读line类新增加的操作。");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: