【缘起】
本周六的时候,本人进行了一场关于设计模式中访问者的分享。
但是本人一紧张就说话语速略快,所以就想将自己分享的主要思想写出来,以便将自己的想法分享给大家。
【参考资料】
程杰著 《大话设计模式》
《设计模式-可复用面向对象软件的基础》
【主要思想】
1 访问者的特点: 稳定的数据结构和多变的算法。
2 结构图(UML类图)
3 访问的过程
step1 需求驱动
声明算法
因为访问者的使用场景是稳定的数据结构,申请访问的对象是固定的,如这里只有ConcreteElementA和ConcreteElementB
如果我拥有了某个具体对象的访问权(可以使用它的公共静态属性,公共动态方法)时,我在访问该具体对象的时候,我会做什么。即编写VisitConcreteElementA() 和Visit ConcreteElementB()。
step2 申请访问权
又因为访问者的使用场景是稳定的数据结构,所以可以将数据对象都封装在一个对象结构ObjectStructure中。
当我们需要发送对每个访问对象的访问权申请的时候,只需要将访问申请发送给对象结构。然后通过对象结构,遍历结构中的被访问对象,就能够让每个被访问对象都通过Accept(Vistor visitor)对算法(操作) 访问者的访问申请进行审核(识别访问者的身份并判断)。
step3 审核访问权
通过Accept(Visitor visitor)将访问者对象作为参数传入,通过visitor.GetType().Name (对象名) 公共静态属性的获取,可以对不同的访问者(申请调用该对象的具体操作类)设置不同的访问权限(可以调用和不可调用)。
step4 执行 调用对象实现算法(具体操作)
如果该对象对访问者设置的权限是可以访问,在允许访问的方法体中就会调用具体的操作,也就是,一旦获得了访问权,就马上实施权利。
以上就是在访问者模式下,一次完整的访问的流程。
4 面对修改封闭,面对扩展开放
该模式,添加算法(作用在数据结构上的具体操作)容易,新写一个具体算法类(写一份访问申请书)即可。
添加对象,则需要修改多处,更需要新建算法父类,违背了开闭原则 。
5 适用场景
一系列的操作中,具体操作用到的操作对象是一个对象集合的子集,并且操作较复杂的时候,可以采用该设计模式,可以起到算法和数据结构解耦的作用。
【感谢阅读】