设计模式学习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类新增加的操作。"); } }
相关文章推荐
- 设计模式学习19 Visitor
- IOS设计模式学习(19)策略
- java/android 设计模式学习笔记(19)---状态模式
- 设计模式学习笔记--解释器模式Interpreter与访问者模式Visitor(Java版)
- 步步为营 .NET 设计模式学习笔记 二十一、Visitor(访问者模式)
- 设计模式学习-每日一记(19.备忘录模式)
- 设计模式学习笔记--访问者(Visitor)模式
- 步步为营 .NET 设计模式学习笔记 二十一、Visitor(访问者模式)
- IOS设计模式学习(19)策略
- 【笨鸟先飞】Java重新学习日记19--设计模式之命令模式
- 设计模式学习笔记(19)——命令模式
- 学习php设计模式 php实现访问者模式(Visitor)
- 设计模式学习笔记——访问者(Visitor)模式
- 步步为营 .NET 设计模式学习笔记 二十一、Visitor(访问者模式)
- 设计模式学习—访问者模式(Visitor Design Pattern)
- 设计模式学习之备忘录模式(Memento,行为型模式)(19)
- 设计模式学习之访问者模式(Visitor,行为型模式)(21)
- 设计模式深入学习--Visitor 访问者模式(行为型模式)
- 【HeadFirst 设计模式学习笔记】19 桥接(Bridge)模式拾零
- 学习php设计模式 php实现访问者模式(Visitor)