【设计模式】访问者--稳定的数据结构+多变的算法

【缘起】

          本周六的时候,本人进行了一场关于设计模式中访问者的分享。

         但是本人一紧张就说话语速略快,所以就想将自己分享的主要思想写出来,以便将自己的想法分享给大家。

【参考资料】

         程杰著  《大话设计模式》

        《设计模式-可复用面向对象软件的基础》

【主要思想】

      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  适用场景

                 一系列的操作中,具体操作用到的操作对象是一个对象集合的子集,并且操作较复杂的时候,可以采用该设计模式,可以起到算法和数据结构解耦的作用。

 

                                                                                  【感谢阅读】

你可能感兴趣的:(设计模式)