大话设计模式之访问者模式

abstract class Action {
  public abstract void GetManConclusion(Man m);
  public abstract void GetWomanConclusion(Woman w);
   
}
abstract class Person {
  public abstract void Accept(Action visitor);
}
class Success : Action {
  public override GetManConclusion(Man m){
    Console.WriteLine("{0}{1}时,背后多半有一个伟大的女人",m.GetType().Name,this.GetType().Name);
  }
  public override GetWomanConclusion(Woman w){
    Console.WriteLine("{0}{1}时,背后大多有一个不成功的男人",w.GetType().Name,this.GetType().Name);
  }
}

class Failing : Action {
  //与上面代码类似,略
}
class Man : Person {
  public override void Accept(Action visitor) {
    //双分派
    visitor.GetManConclusion(this);
  }
}
class Woman : Person {
  public override void Accept(Action visitor) {
    //双分派
    visitor.GetWomanConclusion(this);
  }
}

这里用到了双分派技术,意味着得到执行的操作决定于请求的种类和两个接收者的类型,接受方法就是一个双分派的操作,它得到执行的操作不仅决定于状态类的具体状态,还决定于访问的人的类别。

能枚举它的元素

对象结构类 

class ObjectStructure {
  private IList<Person> e = new List<Person>();
  public void Attach(Person p){
    e.Add(p);
  }
  public void Detach(Person p){
    e.Remove(e);
  }
  public void Display(Action a) {
    foreach(Person p in e){
      p.Accept(a);
    } 
  }
}
static void Main(string[]args){
  ObjectStructure o = new ObjectStructure();
  o.Attach(new Man());
  o.Attach(new Woman());
  Success v1 = new Success();
  o.Display(v1);
  Failing v2 = new Failing();
  o.Display(v2);
  Amativeness v3 = new Amativeness();
  o.Display(v3);
}

表示一个作用于某对象结构中的各元素的操作,它可以使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作


访问者模式基本代码

abstract class Visitor {
  public abstract void VisitConcreteElementA(ConcreteElementA c1);
  public abstract void VisitConcreteElementB(ConcreteElementB c2);
}
class ConcreteVisitor : Visitor {
  public override void VisitConcreteElementA(ConcreteElementA c1){
    Console.WriteLine("{0}被{1}访问",c1.GetType().Name,this.GetType().Name);
  }

   public override void VisitConcreteElementB(ConcreteElementB c2){
    Console.WriteLine("{0}被{1}访问",c2.GetType().Name,this.GetType().Name);
  }
}
}

abstract class Element {
  public abstract void Accept(Visitor visitor);
}

class ConcreteElementA : ElementA{
  public override void Accept(Visitor v) {
    v.VisitConcreteElement(this);
  }
  public void OperationA(){}
}

class ConcreteElementB  : Element {
  public override void Accept(Visitor v) {
    v.VisitConcreteElementB(this);
  }
   public void OperationB(){}
}

这个模式不容易使用,尽量避免,



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值