访问者模式

2017-06-25  本文已影响0人  上海马超23

结论

优点

  1. 符合单一职责原则,visitor负责展现逻辑,element负责业务逻辑。
  2. 展现的扩展性,只需在visitor里增加应对新element子类的visit方法即可。

缺点

  1. visitor依赖了element的实现。
  2. 修改element的业务逻辑同时,visitor也要做相应改动,修改困难。

双分派

ParentElement xxx = new ChildElement();
ParentVisitor zzz = new ChildVisitor();
// act的参数传的是zzz,zzz的表面类型是Parent,如果有2个重载方法,act(parent) 和 act(child),调用的是前者,哪怕zzz的实际类型是child,这是编译期决定的静态绑定。
// xxx的实际类型是child,所以调用的act是child的act,而不是parent的act,这是运行期决定的动态绑定。
xxx.act(zzz) 

引入到访问者模式

public class ChildElement implements Element {
  // 注意,虽然形参类型是parent,但实际调用visit方法是动态绑定,所以调用的还是childVisitor的visit方法
   public void accept(ParentVisitor visitor) {
    // 而且element调用accept方法本身就是动态绑定,所以访问者模式可以做到2个都是动态绑定。
    visitor.visit(this); 
    }
}
上一篇下一篇

猜你喜欢

热点阅读