你可以嘗試實行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
}
}
現在我們創建角色的一個子類,增加了「羽毛」特質。這個子類必須包含它,以便擴展類的字段來改變自己的行爲:
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
這樣做可以保留對象的原始引用,但同時你可以改變他的行爲。如果你有興趣除去裝修,你可以添加一個方法是這樣的:
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
我希望我已經幫你的,裝飾者模式是一種非常強大的模式,它爲對象的行爲提供了一些靈活性。請讓我知道你是否需要更多解釋。
https://sourcemaking.com/design_patterns/state – jaco0646