> Java > java지도 시간 > 자바 디자인 패턴 시리즈의 데코레이터 패턴

자바 디자인 패턴 시리즈의 데코레이터 패턴

高洛峰
풀어 주다: 2017-01-19 15:56:59
원래의
1056명이 탐색했습니다.

데코레이터 패턴이란 무엇인가요?
객체에 몇 가지 추가 책임을 동적으로 추가합니다. 기능 추가 측면에서 데코레이터 패턴은 하위 클래스를 생성하는 것보다 더 유연합니다.
1. 구조

컴포넌트: 이러한 객체에 책임을 동적으로 추가할 수 있는 객체 인터페이스를 정의합니다.

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();
  }
}
로그인 후 복사

🎜>

2. 적용 시나리오

1입니다. 즉, 다른 개체에 영향을 주지 않고 동적으로 투명하게 개체에 책임을 추가하는 데 필요합니다.

2. 함수는 객체에 동적으로 추가되어야 하며, 이러한 함수는 동적으로 취소될 수 있습니다.

3. 일부 기본 기능의 순열과 조합으로 생성되는 매우 많은 기능이 추가되어야 하므로 상속 관계가 비현실적입니다.

4. 서브클래스 생성 방법을 확장에 사용할 수 없는 경우. 어떤 경우에는 독립적인 확장이 많이 있을 수 있으며, 각 조합을 지원하기 위해 많은 수의 하위 클래스가 생성되어 하위 클래스 수가 폭발적으로 증가하게 됩니다. 또 다른 경우는 클래스 정의가 숨겨져 있거나 클래스 정의를 사용하여 하위 클래스를 생성할 수 없기 때문일 수 있습니다.


3. 포인트


1. 장식된 객체와 실제 객체는 동일한 인터페이스를 갖습니다. 이런 방식으로 클라이언트 개체는 실제 개체와 동일한 방식으로 데코레이팅된 개체와 상호 작용할 수 있습니다.

2. 장식 개체에는 실제 개체에 대한 참조가 포함됩니다.

3. 장식 개체는 클라이언트의 모든 요청을 받아들입니다. 이러한 요청을 실제 객체로 전달합니다.

4. 장식 개체는 이러한 요청을 전달하기 전이나 후에 몇 가지 추가 기능을 추가할 수 있습니다. 이렇게 하면 특정 객체의 구조를 수정하지 않고도 런타임 시 외부적으로 추가 기능을 추가할 수 있습니다. 객체 지향 설계에서 특정 클래스의 기능 확장은 일반적으로 상속을 통해 구현됩니다.

위 내용은 Java 데코레이터 패턴에 대한 소개입니다. 모든 분들의 학습에 도움이 되기를 바랍니다.

자바 디자인 패턴 시리즈 중 데코레이터 패턴과 관련된 더 많은 글은 PHP 중국어 홈페이지를 주목해주세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿