데코레이터 패턴이란 무엇인가요?
객체에 몇 가지 추가 책임을 동적으로 추가합니다. 기능 추가 측면에서 데코레이터 패턴은 하위 클래스를 생성하는 것보다 더 유연합니다.
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. 장식 개체는 클라이언트의 모든 요청을 받아들입니다. 이러한 요청을 실제 객체로 전달합니다.