개념
데코레이터 패턴은 객체에 책임을 동적으로 부여합니다. 기능을 확장하기 위해 데코레이터는 상속에 대한 보다 유연한 대안을 제공합니다.
데코레이터와 데코레이팅된 객체의 상위 유형은 동일합니다.
하나 이상의 데코레이터를 사용하여 객체를 래핑할 수 있습니다.
데코레이터와 데코레이팅된 객체의 상위 유형이 동일하므로 원래 객체(래핑된)가 필요할 때마다 데코레이팅된 객체를 대신 사용할 수 있습니다.
데코레이터는 특정 목적을 달성하기 위해 위임된 데코레이터의 동작 전후에 자체 동작을 추가할 수 있습니다.
개체는 언제든지 장식할 수 있으므로 런타임에 좋아하는 데코레이터를 사용하여
개체를 동적으로 무제한으로 꾸밀 수 있습니다.
Java에서 io 패키지 아래의 많은 클래스는 다음과 같은 일반적인 데코레이터 패턴의 구현입니다.
new BufferedOutputStream(OutputStream out)
new BufferedInputStream(InputStream in );
new PrintWriter(OutputStream out)
new FilterReader(Reader in);
장식된 클래스는 장식된 클래스와 동일한 인터페이스를 구현하며
는 데코레이팅된 클래스는 어떤 구현 클래스를 사용하여 데코레이팅하는지는 중요하지 않습니다.
동일한 비즈니스 방법으로 데코레이팅된 클래스는 데코레이션 클래스의 기능을 향상시키기 위해 데코레이션 클래스의 메서드를 호출합니다.
인스턴스 :
클래스 다이어그램
public interface IReader { void read(); } public class Reader implements IReader { @Override public void read() { System.out.println("read of Reader"); } } public class BufferedReader implements IReader { private IReader mReader; public BufferedReader(IReader reader) { this.mReader = reader; } @Override public void read() { System.out.println("read of BufferedReader"); mReader.read(); } } public class Test { public static void main(String[] args) { Reader reader = new Reader(); reader.read(); System.out.println("----------"); BufferedReader bufferedReader = new BufferedReader(reader); bufferedReader.read(); } }
특징:
1. 장식된 객체는 실제 객체와 동일한 인터페이스를 갖습니다. 이런 방식으로 클라이언트 개체는 실제 개체와 동일한 방식으로 데코레이팅된 개체와 상호 작용할 수 있습니다.
2. 데코레이팅된 객체에는 실제 객체에 대한 참조가 포함됩니다.
3. 데코레이팅된 객체는 클라이언트의 모든 요청을 받아들입니다. 이러한 요청을 실제 객체로 전달합니다.
4. 장식 개체는 이러한 요청을 전달하기 전이나 후에 몇 가지 추가 기능을 추가할 수 있습니다. 이렇게 하면 특정 객체의 구조를 수정하지 않고도 런타임 시 외부적으로 추가 기능을 추가할 수 있습니다.
객체 지향 설계에서 특정 클래스의 기능 확장은 일반적으로 상속을 통해 구현됩니다. 장식 후에는 실물을 보관하여 기능성을 강화합니다.
데코레이터 패턴과 어댑터 패턴의 차이점:
새로운 책임에 대해: 어댑터는 변환 중에 새로운 책임을 추가할 수도 있지만 주요 목적은 여기에 없습니다. 데코레이터 패턴은 주로 데코레이터에 새로운 책임을 추가합니다.
포장하는 객체에 대해: 어댑터는 적응되는 사람(즉, 어댑터 클래스)의 세부 정보를 알고 있습니다. 데코레이터는 인터페이스가 무엇인지만 알 수 있습니다.
특정 유형(기본 클래스인지 다른 파생 클래스인지)은 런타임 중에만 알 수 있습니다.
Java 디자인 패턴 프로그래밍에서 데코레이터 패턴 적용을 설명하는 더 많은 예제를 보려면 PHP 중국어 웹사이트에서 관련 기사를 주목하세요!