[转载] C#面向对象设计模式纵横谈——24 Visitor访问者模式

本文通过C#编程语言展示了设计模式中抽象类、多态性及访问者模式的应用,具体以形状(Rectangle、Circle、Line)为例,实现形状之间的通用操作和特定操作的扩展。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主讲:李建忠

来源:http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/consyscourse/CsharpOOD.aspx

 

clip_image002

clip_image004

clip_image006

clip_image008

 

   1:  public abstract class Shape
   2:  {
   3:      public abstract void Draw();
   4:   
   5:      //预料到将来可能会引入新的操作
   6:      public abstract void Accept(ShapeVisitor v);
   7:  }
   8:   
   9:  public abstract class ShapeVisitor
  10:  {
  11:      public abstract void Visit(Rectangle shape);    //#1
  12:      public abstract void Visit(Circle shape);    //#2
  13:      public abstract void Visit(Line shape);    //#3
  14:  }
  15:   
  16:  public class MyVisitor:ShapeVisitor
  17:  {
  18:      public override void Visit(Rectangle shape);    //#1
  19:      {
  20:          //增加对Rectangle的操作
  21:      }
  22:   
  23:      public override void Visit(Circle shape);    //#2
  24:      {
  25:          //增加对Circle的操作
  26:      }
  27:   
  28:      public override void Visit(Line shape);    //#3
  29:      {
  30:          //增加对Line的操作
  31:      }
  32:  }
  33:   
  34:  public class Rectangle:Shape
  35:  {
  36:      public override void Draw()
  37:      {
  38:          //...
  39:      }
  40:   
  41:      public override void Accept(ShapeVisitor v)
  42:      {
  43:          v.Visit(this);    //调用 #1
  44:      }
  45:  }
  46:   
  47:  public class Circle:Shape
  48:  {
  49:      public override void Draw()
  50:      {
  51:          //...
  52:      }
  53:   
  54:      public override void Accept(ShapeVisitor v)
  55:      {
  56:          v.Visit(this);    //调用 #2
  57:      }
  58:  }
  59:   
  60:  public class Line:Shape
  61:  {
  62:      public override void Draw()
  63:      {
  64:          //...
  65:      }
  66:   
  67:      public override void Accept(ShapeVisitor v)
  68:      {
  69:          v.Visit(this);     //调用 #3
  70:      }
  71:  }
  72:   
  73:  class App
  74:  {
  75:      ShapeVisitor visitor;
  76:      public App(ShapeVisitor visitor)
  77:      {
  78:          this.visitor=visitor;
  79:      }
  80:   
  81:      public static void Process(Shape shape)
  82:      {
  83:          //两处多态:
  84:          //1.Accept方法的调用对象 shape
  85:          //2.Accept等方法的参数 visitor
  86:          shape.Accept(visitor);
  87:      }
  88:  }
  89:   
  90:  App app=new App(new MyVisitor());
  91:  app.Process(new Line());

 

clip_image010

clip_image012

转载于:https://www.cnblogs.com/6DAN_HUST/archive/2012/10/18/2728995.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值