디자인 모드 3: 장식 모드

3538 단어
장식 모드 (Decorator Pattern) 는 대상 의 기능 을 동적 으로 부가 할 수 있 고 장식 기 는 계승 보다 유연 한 확장 방안 을 제공 합 니 다.이 모델 은 계승 하 는 대체 방안 이다.일반적으로 이 모델 의 밑바닥 은 인터페이스 나 추상 류 이다.그 다음 에 이 인 터 페 이 스 를 확장 하거나 추상 류 를 계승 하여 '집합' 작업 을 해 야 한다.즉, 장식 류 는 기 존의 기능 에 추가 적 인 기능 을 부가 하 는 것 이다.코드 를 보 세 요.
Troll 인터페이스, 괴물 이라는 뜻?트 롤?세 개의 함수 가 있다.
/**
 * 
 * Interface for trolls
 *
 */
public interface Troll {

  void attack();

  int getAttackPower();

  void fleeBattle();

}

그리고 Simple Troll 류 는 Troll 인 터 페 이 스 를 사용 합 니 다.
/**
 * 
 * SimpleTroll implements {@link Troll} interface directly.
 *
 */
public class SimpleTroll implements Troll {

  private static final Logger LOGGER = LoggerFactory.getLogger(SimpleTroll.class);

  @Override
  public void attack() {
    LOGGER.info("The troll tries to grab you!");
  }

  @Override
  public int getAttackPower() {
    return 10;
  }

  @Override
  public void fleeBattle() {
    LOGGER.info("The troll shrieks in horror and runs away!");
  }
}

장식 류 트 롤 데 코 레이 터 는 트 롤 인 터 페 이 스 를 사 용 했 을 뿐만 아니 라 자신 도 하 나 를 따로 가지 고 인터페이스 함 수 를 모두 다른 것 에 의뢰 한 것 을 볼 수 있다.
/**
 * TrollDecorator is a decorator for {@link Troll} objects. The calls to the {@link Troll} interface
 * are intercepted and decorated. Finally the calls are delegated to the decorated {@link Troll}
 * object.
 *
 */
public class TrollDecorator implements Troll {

  private Troll decorated;

  public TrollDecorator(Troll decorated) {
    this.decorated = decorated;
  }

  @Override
  public void attack() {
    decorated.attack();
  }

  @Override
  public int getAttackPower() {
    return decorated.getAttackPower();
  }

  @Override
  public void fleeBattle() {
    decorated.fleeBattle();
  }
}

하나의 구체 적 인 장식 이 실현 되 고 장식 류 를 계승 하 며 초 류 를 호출 하 는 토대 에서 자신 이 뭔 가 를 추가 하 는 것 이다. 초 류 의 실현 은 바로 외부 에 있 는 Troll 인터페이스 가 실현 되 는 것 이다. 그러면 기 존의 Troll 외 에 기능 을 추가 했다.
/**
 * Decorator that adds a club for the troll
 */
public class ClubbedTroll extends TrollDecorator {

  private static final Logger LOGGER = LoggerFactory.getLogger(ClubbedTroll.class);

  public ClubbedTroll(Troll decorated) {
    super(decorated);
  }

  @Override
  public void attack() {
    super.attack();
    LOGGER.info("The troll swings at you with a club!");
  }

  @Override
  public int getAttackPower() {
    return super.getAttackPower() + 10;
  }
}

너 는 이것 도 상속 이 아니 냐 고 물 을 지도 모른다.확실히 계승 까지 실 용적 이지 만 단순히 계승 을 사용 하여 기능 을 확장 하 는 것 과 는 큰 차이 가 있다.차이 가 뭘 까요?운행 할 때 종 류 를 바 꿀 수 있 는 행동 이다.
public static void main(String[] args) {

    // simple troll
    LOGGER.info("A simple looking troll approaches.");
    Troll troll = new SimpleTroll();
    troll.attack();
    troll.fleeBattle();
    LOGGER.info("Simple troll power {}.
", troll.getAttackPower()); // change the behavior of the simple troll by adding a decorator LOGGER.info("A troll with huge club surprises you."); Troll clubbed = new ClubbedTroll(troll); clubbed.attack(); clubbed.fleeBattle(); LOGGER.info("Clubbed troll power {}.
", clubbed.getAttackPower()); } }

Simple Troll 은 일반적인 Troll 로 Clubbed Troll 장식 을 해 주면 곧 Clubbed Troll 기능 이 생 긴 다.이런 식 으로 유추 하면 다른 장식 도 넣 을 수 있다.이것 은 또 계승 과 의 또 다른 중요 한 차이 점 이다. 자유 조합 이다.N 개의 장식 자 는 모두 2 ^ N 개의 서로 다른 종 류 를 만 들 수 있 습 니 다. 만약 에 하나씩 계승 하면... 물론 장식 자의 특성 상 추가 기능 은 특정한 순 서 를 요구 하지 않 는 것 이 좋 습 니 다. 즉, 추가 기능 간 에 서로 영향 을 주지 않 는 것 이 가장 좋 습 니 다.

좋은 웹페이지 즐겨찾기