개념
데코레이터 패턴은 물체에 책임을 역동적으로 첨부합니다. 기능을 확장하기 위해 데코레이터는 상속보다 유연한 대안을 제공합니다.
데코레이터와 장식 된 물체는 동일한 슈퍼 유형을 가지고 있습니다.
하나 이상의 데코레이터로 물체를 감을 수 있습니다.
데코레이터와 장식 된 물체는 동일한 슈퍼 형을 갖기 때문에 원래 물체 (쓰여진)가 필요한 경우에는 장식 된 물체를 대체 할 수 있습니다.
데코레이터는 특정 목적을 달성하기 위해 데코레이터의 행동이 위탁 된 후 또는 후에 자신의 행동을 추가 할 수 있습니다.
물체는 언제든지 장식 할 수 있으므로 런타임 중에 좋아하는 데코레이터로 물체를 동적으로 그리고 무제한으로 장식 할 수 있습니다.
Java에서 IO 패키지의 많은 클래스는 다음과 같은 일반적인 데코레이터 패턴의 구체 예입니다.
장식 클래스는 장식 된 클래스와 동일한 인터페이스를 구현합니다.
장식 된 클래스는 어떤 구현 클래스를 장식하는지 신경 쓰지 않습니다.
장식 클래스의 기능을 향상시키기 위해 동일한 비즈니스 방법을 장식 클래스에서 호출합니다.
예:
클래스 다이어그램
공개 인터페이스 iReader {void read (); } public class Reader는 iReader {@override public void read () {system.out.println ( "Read of Reader"); }} public class bufferedReader는 ireader {private iReader mreader를 구현합니다. Public BufferedReader (Ireader Reader) {this.mreader = Reader; } @override public void read () {System.out.println ( "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. 객체 장식은 이러한 요청을 전달하거나 전후에 추가 기능을 추가 할 수 있습니다. 이를 통해 런타임에 주어진 객체의 구조를 수정하지 않고 외부에서 추가 기능을 추가 할 수 있습니다.
객체 지향 설계에서, 주어진 클래스에 대한 기능 확장은 일반적으로 상속을 통해 달성됩니다. 장식 후 실제 물체는 기능을 향상시키기 위해 고정됩니다.
데코레이터와 어댑터 모드의 차이 :
새로운 책임에 대해 : 어댑터는 변환 할 때 새로운 책임을 추가 할 수 있지만 주요 목적은 그렇지 않습니다. 데코레이터 모델은 주로 데코레이터에 새로운 책임을 추가합니다.
랩하는 객체에 대해 : 어댑터는 어댑터의 세부 사항 (즉, 어댑터 클래스)을 알고 있습니다. 데코레이터는 인터페이스가 무엇인지 알고 있습니다.
특정 유형 (기본 클래스 또는 기타 파생 클래스이든)에 대해서는 런타임 중에 만 알려져 있습니다.