《设计模式沉思录》—第2章2.5节关于VISITOR的一些警告

简介: 如果所有的visitor对新的子类不感兴趣,而且我们已经定义了一个与visitNode等价的操作来在默认情况下进行合理的处理,那么就不存在问题。但是,如果只有一种类型的visitor对新的子类感兴趣,那么我们至少必须对该visitor和Visitor基类进行修改。

本节书摘来自异步社区《设计模式沉思录》一书中的第2章,第2.5节关于VISITOR的一些警告,作者【美】John Vlissides,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.5 关于VISITOR的一些警告
在使用VISITOR模式之前,有两件事情需要考虑。

首先问一下自己,被访问的类层次结构是否稳定?拿我们的例子来说,我们是否会经常定义新的Node子类,还是说这种情况很少见?增加一种新的Node类型可能会迫使我们仅仅为了增加一个相应的visit操作而修改Visitor类层次结构中所有的类。

如果所有的visitor对新的子类不感兴趣,而且我们已经定义了一个与visitNode等价的操作来在默认情况下进行合理的处理,那么就不存在问题。但是,如果只有一种类型的visitor对新的子类感兴趣,那么我们至少必须对该visitor和Visitor基类进行修改。此外,在这样的情况下,进行多处修改很可能是不可避免的。如果我们没有使用VISITOR模式,而是把所有功能塞到了Node类层次结构中,那么可能我们最终也要对Node类层次结构进行多处修改。

我们要考虑到的第二点是,VISITOR模式在Visitor和Node类层次结构之间创建了一个循环依赖关系。因此,对任何一个基类的接口进行修改,很可能会促使编译器对这两个类层次结构都进行重新编译。当然,和修改一个大杂烩基类相比,这可能也差不到哪里去。但在一般情况下,我们希望避免这样的依赖关系。

※   ※   ※

下面是Kevlin Henney [Henney96]的一些相关见解:

C++重载机制并没有强迫我们必须重载visit的所有版本,或者必须放弃重载visit成员。

using声明不仅用来支持名字空间的概念,它还允许我们把基类中的名字注入到当前类中来帮助重载。

class NewVisitor : public Visitor {
public:
  using Visitor::visit;    // pull in all visit functions
                  // for overloading

  virtual void visit(Subject**); // override Subject**variant
};

这种方法不仅保持了重载所提供的规整性,而且还可以防止扩散。它不会强迫用户去记住[visit]系列函数用了哪些名字或用了什么命名约定。这种方法使我们能在新版本中对Visitor进行修改,同时不会对客户代码产生影响。

※   ※   ※

我们已经运用了两个模式(即COMPOSITE模式和PROXY模式)来定义文件系统结构,还运用了一个模式来以一种无扩散的方法(即添加代码而不是修改代码)来引入新功能。其中蕴含了一条很好的面向对象设计准则,也许属于老生常谈,但却值得一提:通过在不修改已有代码的前提下改变一个系统的行为,可以使系统达到最佳的灵活性和可维护性。如果在别人使用了你的软件之后,你仍然能够这样说,那么恭喜你——你已经兑现了对象技术的诸多承诺!

扯远了。我们的文件系统的另一个主要设计问题与安全性有关。它至少有两个相关的子问题。

(1)对文件系统进行保护,使之避免遭到无意或恶意的破坏。

(2)在面临硬件和软件故障时,依然能够维护文件系统的完整性。

这里我们将集中讨论第一个子问题,第二个子问题留给读者作为练习。(如果有谁愿意接受这个挑战,我将很乐意为他的解决方案评分。)

相关文章
|
6月前
|
设计模式 算法
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
73 1
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
|
11月前
|
设计模式 关系型数据库 BI
认真学习设计模式之访问者模式(Visitor Pattern)
认真学习设计模式之访问者模式(Visitor Pattern)
68 0
|
设计模式 缓存 Kubernetes
【K8s源码品读】003:Phase 1 - kubectl - 设计模式中Visitor的实现
理解kubectl的核心实现之一:Visitor Design Pattern 访问者模式
68 0
|
设计模式 BI
设计模式18 - 访问者模式【Visitor Pattern】
设计模式18 - 访问者模式【Visitor Pattern】
38 0
|
设计模式 存储 Java
【设计模式——学习笔记】23种设计模式——访问者模式Visitor(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——访问者模式Visitor(原理讲解+应用场景介绍+案例介绍+Java代码实现)
59 0
|
设计模式 算法 BI
设计模式~访问者模式(Visitor)-15
在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对
44 0
|
设计模式 XML 存储
Java中23种面试常考的设计模式之访问者模式(Visitor)---行为型模式
Java中23种面试常考的设计模式之访问者模式(Visitor)---行为型模式
93 1
|
设计模式 算法 Java
Java设计模式-访问者模式(Visitor)
Java设计模式-访问者模式(Visitor)
|
设计模式 算法 容器
从零开始学设计模式(十三):访问者模式(Visitor Pattern)
前面的几篇文章分别介绍了创建型设计模式和结构型设计模式,接下来的几篇文章将介绍行为型设计模式
171 0
从零开始学设计模式(十三):访问者模式(Visitor Pattern)
|
设计模式 安全 Java
设计模式|从Visitor Pattern说到Pattern Matching
在软件开发领域,我们每次遇到的问题可能都各不相同,有些是跟电商业务相关的,有些是跟底层数据结构相关的,而有些则可能重点在性能优化上。然而不管怎么样,我们在代码层面上解决问题的方法都有一定的共性。有没有人总结过这些共性呢?
设计模式|从Visitor Pattern说到Pattern Matching