鉴于您的类层次结构使用带有接口的组合来提供默认的 EnergyContainer 行为
abstract class Element {
EnergyContainer ec = new EmptyEnergyContainer();
int getEnergyValue() {
getEnergyContainer().getValue();
}
EnergyContainer getEnergyContainer() {
return ec;
}
setEnergyContainer(EnergyContainer container) {
this.ec = container;
}
}
class Robot extends Element {
public Robot() {
this.ec = new ActiveEnergyContainer();
}
}
class Item extends Element{
public Item() {
this.ec = new ActiveEnergyContainer();
}
}
class Brick extends Element{
// will have a EmptyEnergyContainer by default
}
EnergyContainer 的接口层次结构是这样的
interface EnergyContainer {
int getValue();
setValue(int value);
}
class EmptyEnergyContainer implements EnergyContainer {
@Override
int getValue() {
return 0;
}
@Override
setValue(int val) {
throw Exception("Can not charge an empty container");
}
}
class ActiveEnergyContainer implements EnergyContainer {
int value;
@Override
int getValue() {
return 17 + 3; // calculate the value
}
@Override
setValue(int val) {
this.value = val // or do some funky calculation
}
}
在运行时,您可以为您的对象设置新的 EnergyContainer 类型。如果您有多个父类,Element
那么您将必须遵循相同的模式,将默认行为添加到抽象父类并根据需要进行覆盖。
让默认行为为 getValue() 返回一个合理的默认值将帮助您不必到处使用instanceof
。
此代码的潜在改进将是引入
- 用于创建各种 EnergyContainer 变体的 AbstractFactory 模式
- 包括一种
hasEnergy()
使您的代码更具可读性而不是检查值 == 0 的方法
Element
如果其他类似的父类将包含类似的方法,请实现一个接口