당신은 원본 객체의 참조를 변경하지 않고, 일반적으로 동적 객체에 동작을 추가하고 제거하는 데 사용되는 Decorator Pattern를 구현을 시도 할 수 있습니다. Wikipedia 페이지에서는 좋은 설명과 예제를 제공합니다. 어쨌든 간단한 자바를 보여 주려고 노력할 것입니다. (당신이 이해할 수 있기를 바랍니다.
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