您可以尝试实现Decorator Pattern,它通常用于动态添加和删除对象的行为,而不更改原始对象的引用。维基百科页面为您提供了很好的解释和示例。
无论如何,我会尝试向您展示一个简单的 Java(希望您能理解它,您没有指定语言)示例可能更接近您的情况。
假设你有一个这样的字符类:
public class Character {
public int calculateFallDamage() {
return 10;
}
public void pickUpItem() {
// initially this method could be empty
// nothing happens when you try to pick up items
}
}
现在我们创建一个添加“羽毛”特征的 Character 子类。这个子类必须包含它扩展的类的一个字段,以改变它的行为:
public class FeatherDecorator extends Character {
private Character decoratedCharacter;
public FeatherDecorator(Character character) {
this.decoratedCharacter = character;
}
@Override
public int calculateFallDamage() {
int fallDamage = decoratedCharacter.calculateFallDamage(); // call the function of the decorated class
return fallDamage - 5; // change the result
}
}
如果您想添加“羽毛”特征,您可以创建一个新对象,如下所示:
Character character = new Character();
int fallDamage = character.calculateFallDamage(); // returns 10
character = new FeatherDecorator(character);
int newFallDamage = character.calculateFallDamage(); // returns 5
这样做你可以保留对 Object 的原始引用,但同时你可以改变他的行为。如果您有兴趣删除装饰,可以添加如下方法:
public class Character() {
...
public Character getDecoratedComponent() {
// exception becaus it's not decorated
}
...
}
public class FeatherDecorator extends Character {
private Character decoratedCharacter;
...
@Override
public Character getDecoratedComponent() {
return decoratedCharacter;
}
...
}
现在很容易得到没有装饰的原始对象:
Character character = new FeatherDecorator(new Character());
character = character.getDecoratedComponent(); // returns the object without the feater decorator
希望对你有所帮助,装饰器模式是一种非常强大的模式,它为对象的行为提供了一定的灵活性。如果您需要更多解释,请告诉我。