java 디자인 모델 시리즈의 장식자 모델

장식자 모드(Decorator)는 무엇입니까?
동적으로 대상에 추가 직책을 추가합니다.기능을 추가하는 데 있어서, Decorator 모드는 하위 클래스를 생성하는 것보다 더욱 유연하다.
구조
Component: 동적으로 역할을 추가할 수 있는 객체 인터페이스를 정의합니다.

interface Component {
  public void operation();
}
ConcreteComponent :   Component  。
class ConcreteComponent implements Component {
  @Override
  public void operation() {
    System.out.println(" ");
  }
}
Decorator: 추상적인 클래스를 장식하고 Component를 계승하며 외부 클래스에서 Component 클래스의 기능을 확장하지만 Component에 있어 Decorator의 존재를 알 필요가 없다.

class Decorator implements Component {
  //   Component  ,  Component  
  protected Component component;
  
  //  
  public Decorator(Component component) {
    this.component = component;
  }
  
  @Override
  //  
  public void operation() {
    component.operation();
  }
}
ConcreteDecorator: 구체적인 장식 대상은 Component에 직책을 추가하는 기능을 합니다.

class ConcreteDecoratorA extends Decorator {
  private String addedState = " 1";
  
  public ConcreteDecoratorA(Component component) {
    super(component);
  }
  
  public void operation() {
    super.operation();
    System.out.println(" : " + addedState);
  }
}

class ConcreteDecoratorB extends Decorator {
  public ConcreteDecoratorB(Component component) {
    super(component);
  }

  public void operation() {
    super.operation();
    AddedBehavior();
  }
  
  public void AddedBehavior() {
    System.out.println(" ");
  }
}

테스트 코드

public class DecoratorPattern {
  public static void main(String[] args) {
    Component component = new ConcreteComponent();
    component.operation();
    
    System.out.println("======================================");
    Decorator decoratorA = new ConcreteDecoratorA(component);
    decoratorA.operation();
    
    System.out.println("======================================");
    Decorator decoratorB = new ConcreteDecoratorB(decoratorA);
    decoratorB.operation();
  }
}
실행 결과

 
======================================
 
 :  1
======================================
 
 :  1
 
2. 응용 장면
1. 동적이고 투명하게 하나의 대상에 직책을 추가해야 한다. 즉, 다른 대상에 영향을 주지 않는다.
2. 동적으로 하나의 대상에 기능을 추가해야 한다. 이런 기능은 다시 동적으로 취소할 수 있다.
3. 일부 기본 기능의 배열 조합으로 인해 발생하는 매우 대량의 기능을 증가시켜 계승 관계를 비현실적으로 만들어야 한다.
4. 서브클래스를 생성하는 방법으로 확충할 수 없을 때.한 가지 상황은 모든 조합을 지원하기 위해 대량의 하위 클래스가 생겨 하위 클래스의 수가 폭발적으로 증가할 수 있다는 것이다.또 다른 상황은 클래스 정의가 숨겨져 있거나 클래스 정의가 하위 클래스를 생성하는 데 사용할 수 없기 때문일 수도 있습니다.
요점
1. 장식 대상과 실제 대상은 같은 인터페이스를 가진다.이렇게 하면 클라이언트 대상은 실제 대상과 같은 방식으로 장식 대상과 상호작용할 수 있다.
2. 장식 대상은 실제 대상의 인용(reference)을 포함한다.
3. 장식 대상은 클라이언트의 요청을 모두 받아들인다.그것은 이 요청들을 진실한 대상에게 전달한다.
4. 장식 대상은 이러한 요청을 전달하기 전이나 이후에 추가 기능을 추가할 수 있다.이렇게 하면 운행할 때 주어진 대상의 구조를 수정하지 않고 외부에 추가 기능을 추가할 수 있다.대상을 대상으로 하는 디자인에서는 일반적으로 계승을 통해 주어진 클래스에 대한 기능 확장을 실현한다.
이상은 자바 장식자 모델에 대한 소개입니다. 여러분의 학습에 도움이 되었으면 합니다.

좋은 웹페이지 즐겨찾기