あなたは通常、元のオブジェクトの参照を変更せずに、動的にオブジェクトに振る舞いを追加および削除するために使用され、Decorator Patternを実装しようとすることができます。 Wikipediaのページには、良い説明と例があります。 とにかく、私は単純な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 character = new Character();
int fallDamage = character.calculateFallDamage(); // returns 10
character = new FeatherDecorator(character);
int newFallDamage = character.calculateFallDamage(); // returns 5
:あなたはこのような新しいオブジェクトを作成する必要があり、「羽」形質を追加したい場合は
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
}
}
:このサブクラスは、その振る舞いを変更することが順番に拡張したクラスのフィールドが含まれている必要があります
このようにすると、オブジェクトへの元の参照を保持できますが、同時に彼の振る舞いを変更することができます。あなたは装飾を削除するに興味を持っている場合は、次のようにメソッドを追加することができます。
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