知识卡片
访问者模式用类爆炸换来不修改原有类型
内容
当已有类型无法修改(比如它属于一个不允许被使用者改动的第三方库),却又必须给它加一个新操作时,访问者模式的做法是:先让所有目标类型继承同一个能接受访问者的公共基类,再为每一个新操作单独造一个访问者子类,把新逻辑塞进访问者里而不去碰原有类型。这确实避免了修改原有代码,但代价是访问者类的数量会随着新操作数量线性增长,最后造出一大批只服务于单一用途、彼此高度相似的小类,形成明显的类爆炸。
参考来源
- 位置:《架构之美》第13章《软件架构:面向对象与面向函数》13.5.3节《可扩展性:添加操作》(源文件:程序之美系列套装(6册)团队之美、项目管理之美、架构之美、数据之美、测试之美、安全之美/_epub-src/OEBPS/Text/part0270.xhtml)
- 结论依据:原文明确说明访问者模式让目标类"无需知道外部所需要的新操作",但"更令人不安的是,随着表示每种特定知识(基于特定类型的特定操作)的、小型的F_VISITOR类的大量增加,最终将出现'类爆炸'现象"。
- 原始内容:如果客户系统不允许修改原有类或不允许访问其上下文,那么该解决方案甚至可能是不可用的……针对该问题,广泛应用的标准的面向对象解决方案是访问者模式……更令人不安的是,随着表示每种特定知识……的、小型的F_VISITOR类的大量增加,最终将出现"类爆炸"现象。