java - 无需修改基类即可更改行为

标签 java inheritance design-patterns

我有一个类,我们将其称为 A ,其方法为 foo(/*with some params*/) 。我已经在我的代码中使用了该类。现在,如果我传递给上述方法的某些参数 bar 具有特定值,我希望我的 foo() 方法返回略有不同的结果。

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

是否可以使用某种设计模式来进行更改,并记住以下要求:a)在我的代码中继续使用 A (可能使用 InterfaceA 并使用而不是 A),所以我不必更改它 b) 不要修改类 A 的代码,因为稍后可能会出现一个类 C ,其 foo() 和另一个,然后另一个......

最佳答案

您可以定义B,它将扩展A实现的接口(interface),并将A(或者更好的是接口(interface)类型)作为字段.

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"
  }
}

这是装饰器模式的一个示例,as Wikipedia puts it ,

allows behavior to be added to an individual object, dynamically, without affecting the behavior of other objects from the same class.

关于java - 无需修改基类即可更改行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57268846/

相关文章:

Java:无法使用 JDBC ODBC 更新 Excel

java - 无法在 child() 中为参数 'pathString' 传递 null

java - Android - 指定的 child 已经有一个 parent 。您必须先对 child 的 parent 调用 removeView()

java - Java 继承的问题

c++ - 为什么这段代码中继承的函数隐藏在基类中?

objective-c - 强制子类在 Objective-C 中调用其父类(super class)方法

c# - 如何设计这样的项目?

java - JInternalFrame 置于前面并聚焦

asp.net - 为什么在客户端请求之间打开数据库连接是一个坏主意?

Java - 用于重复 sql 任务的设计模式