首页 > 解决方案 > 在不修改基类的情况下改变行为

问题描述

我有一个类,让我们A用一个方法来调用它foo(/*with some params*/)。我已经在我的代码中使用了那个类。现在,如果我传递给上述方法的某些 parambar具有特定值,我希望我的foo()方法返回稍微不同的结果。

显然,我可以创建一个类B并复制foo方法的代码,稍微修改一下以满足我的需要,并在运行时检查值bar并决定调用哪个类。

是否可以使用一些设计模式来进行更改,并考虑以下要求:a)继续A在我的代码中使用(可能使用 anInterfaceA并使用它而不是A)所以我不必更改它并且 b)不要修改类的代码,A因为以后可能会有一个类C被改变foo(),另一个然后另一个......

标签: javainheritancedesign-patterns

解决方案


您可以定义B哪个将扩展已A实现的接口并将A(或更好的接口类型)作为字段。

interface AbstractA {
   void foo(Object o);
}
class A implements AbstractA {
  @Override
  public void foo(Object o) {}
}

class B implements AbstractA {
  private AbstractA abstractA;

  @Override
  public void foo(Object o) {
    abstractA.foo(o);
    // "a slightly different result"
  }
}

这是装饰器模式的一个例子,正如维基百科所说

允许将行为动态添加到单个对象,而不会影响同一类中其他对象的行为。


推荐阅读