Visitor 访问者模式
意圖
? 表示一個作用于某對象結構的各個元素的操作,他可以在不改變各元素的前提下定義作用于這些元素的新的操作。
public abstract class Shape
{
public abstract void Draw();
}
public class Rectangle :Shape
{
public override void Draw()
{
//
}
}
public calss Circle:Shape
{
public override void Draw()
{
//
}
}
假設現在Shape 需要新增加一個特性MoveTo操作,它所有的子類都需要添加一個Moveto的Override方法。
public abstract calss Shape
{
public abstract void Draw()
publci abstract void MoveTo(Point p);
}
改進代碼
public abstract class Shape
{
public abstract void Draw();
//預料到未來可能會做的操作
public abstract void Accpt(SharpVisitor v);
}
public abstract class ShapeVisitor
{
public abstract void Visit(Recctangle shape)
public abstract void Visit(Cirele shape);
public abstract void Visit(Line shape);
}
public class Rectangle:Shape
{
public override void Draw()
{
//
}
}
public voerride void Accpte(ShapeVisitor v)
{
v.Visit(this);//調用方法
}
public class Cirele:Shape
{
public override void Draw()
{
//
}
public override void Accept(ShpeVistor v)
{
v.Visit(this);
}
}
public class Line:Shape
{
public override void Draw()
{
//
}
public override void Accept(ShapeVisitor v)
{
v.Visit(this);
}
}
雖然子類的重載方法都是一樣的代碼,但是不能放在基類中寫成Visit方法。因為首先Visit方法接受的類型不是多態類型,而是具體類型。傳人的this是一種編譯時綁定,他是一種靜態多態。如果是在基類中寫Accept虛方法,里面寫上v.visit(this).編譯的時候就會出錯,因為Visit方法里接收的沒有shape類型,所有只能在子類中重寫?,F在就給各個子類增加操作
public? class MyVisitor:ShapeVistor
{
public override void Visit(Rectangle shape)
{
//
}
public abstract void Visit(Cirele shape)
{
}
public abstract void Visit(Line shape)
{
//
}
}
當然操作可能需要傳入參數,我們可以為Accept方法添加一個上下文信息
public abstract class Shape
{
public abstract void Draw();
public abstract void Accept(ShapeVisitor v,Context context);
}
class App
{
ShapeVisitor vistor;
public App(ShapeVisitor visitor)
{
this.visitor = visitor;
}
public void Process(Shape shape)
{
shape.Accept(visitro);
}
}
?
轉載于:https://www.cnblogs.com/yuanxiang/archive/2012/05/15/2500823.html
總結
以上是生活随笔為你收集整理的Visitor 访问者模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery validate 表单验证
- 下一篇: 注册DirectShow filter时