代码之家  ›  专栏  ›  技术社区  ›  doomspork

添加功能:子类vs装饰器

  •  0
  • doomspork  · 技术社区  · 16 年前

    我目前正在使用Oracle的ADF Faces JSF实现开发一个遗留系统,用于表示层。系统依赖于规则引擎,根据用户与表单元素的交互或输入的值,使某些表单元素成为必需、禁用甚至高亮显示的元素。

    在它的当前阶段,应用程序正在“工作”,有点像。当前处理规则引擎和前端更新的实现不是很优雅,它由一大组if语句组成,类似于:

    if(screenObj instanceof CoreInputText) {
        ((CoreInputText) screenObj).setDisabled(true);
    }
    

    为了使混合复杂化,我们还混合了我们自己的对象,因此集合作为一个整体不共享一个共同的祖先,从而消除了我们执行以下操作的选择:

    ((CommonAncestor) screenObj).setDisabled(true);
    

    问题是是否值得将代码的这一部分修改得越来越清晰。因为大多数屏幕元素都是ADF Faces元素,所以我们不能/不允许更改它们的祖先来添加其他方法。

    代码更改的目标有两个:清理旧代码并改进代码库,以便添加新元素或控件不会导致较大的代码更改(特别是存在于许多地方的if语句)。

    那么,如果我们继续进行这一变革,哪一个将是实现我们所期待的目标的更好选择?对所有元素进行子类化(每次使用另一个预先存在的控件时都需要一个新类)或实现decorator模式?我对decorator唯一关心的是,它仍然需要对每个附加元素进行代码更改。这两个选项似乎都可以减少代码更改,因为包含这些if块的多个方法不需要更新。

    除了子类化和装饰器之外,任何关于处理这种情况的方法的输入都是受欢迎的!

    1 回复  |  直到 16 年前
        1
  •  1
  •   Yishai    16 年前

    此外,如果这是一个真正的setter,您可以使用apache中的BeanUtils,并将其设置为一个名为disabled的属性。

    然而,我倾向于避免这样做,因为这似乎让人深思得太远了。这使得方法名称很难重构,IDE也不可能知道它们是在该上下文中使用的。乍一看,我认为decorator是正确的选择,因为在没有任何其他考虑的情况下,组合应该优先于继承,它将使代码路径更加清晰,从而改进长期维护。