java - 在不修改基类的情况下改变行为
问题描述
我有一个类,让我们A
用一个方法来调用它foo(/*with some params*/)
。我已经在我的代码中使用了那个类。现在,如果我传递给上述方法的某些 parambar
具有特定值,我希望我的foo()
方法返回稍微不同的结果。
显然,我可以创建一个类B
并复制foo
方法的代码,稍微修改一下以满足我的需要,并在运行时检查值bar
并决定调用哪个类。
是否可以使用一些设计模式来进行更改,并考虑以下要求:a)继续A
在我的代码中使用(可能使用 anInterfaceA
并使用它而不是A
)所以我不必更改它并且 b)不要修改类的代码,A
因为以后可能会有一个类C
被改变foo()
,另一个然后另一个......
解决方案
您可以定义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"
}
}
这是装饰器模式的一个例子,正如维基百科所说,
允许将行为动态添加到单个对象,而不会影响同一类中其他对象的行为。
推荐阅读
- python - SymPy 已安装但默认 Python 版本未找到
- javascript - 将数组和对象转换为自定义对象
- python - 如何在序列化为熊猫数据框时展平嵌套数据类?
- javascript - 在打字稿中正确使用异步(角度)
- amazon-ec2 - 在 InfluxDB v2 中接收 Gatling 结果
- github - 了解存储库 gpt 转换器
- javascript - Chart.js 属性“类型”的类型不兼容。类型 'string' 不可分配给类型 '"line" | “酒吧” | “分散”
- bash - Intellij IDEA 无法打开本地终端 java.util.concurrent.ExecutionException: 无法在 linux 中启动
- javascript - React Native 检测用户何时尝试退出应用程序?
- javascript - Boostrap Carousel 中的图像如何具有相同的宽度?