>Java >java지도 시간 >Java 디자인 패턴 프로그래밍에서 데코레이터 패턴 사용을 설명하는 예

Java 디자인 패턴 프로그래밍에서 데코레이터 패턴 사용을 설명하는 예

高洛峰
高洛峰원래의
2017-01-19 15:53:591171검색

개념

데코레이터 패턴은 객체에 책임을 동적으로 부여합니다. 기능을 확장하기 위해 데코레이터는 상속에 대한 보다 유연한 대안을 제공합니다.

Java 디자인 패턴 프로그래밍에서 데코레이터 패턴 사용을 설명하는 예


데코레이터와 데코레이팅된 객체의 상위 유형은 동일합니다.
하나 이상의 데코레이터를 사용하여 객체를 래핑할 수 있습니다.
데코레이터와 데코레이팅된 객체의 상위 유형이 동일하므로 원래 객체(래핑된)가 필요할 때마다 데코레이팅된 객체를 대신 사용할 수 있습니다.
데코레이터는 특정 목적을 달성하기 위해 위임된 데코레이터의 동작 전후에 자체 동작을 추가할 수 있습니다.
개체는 언제든지 장식할 수 있으므로 런타임에 좋아하는 데코레이터를 사용하여
개체를 동적으로 무제한으로 꾸밀 수 있습니다.

Java에서 io 패키지 아래의 많은 클래스는 다음과 같은 일반적인 데코레이터 패턴의 구현입니다.

new BufferedOutputStream(OutputStream out)

new BufferedInputStream(InputStream in );

new PrintWriter(OutputStream out)

new FilterReader(Reader in);

장식된 클래스는 장식된 클래스와 동일한 인터페이스를 구현하며
는 데코레이팅된 클래스는 어떤 구현 클래스를 사용하여 데코레이팅하는지는 중요하지 않습니다.
동일한 비즈니스 방법으로 데코레이팅된 클래스는 데코레이션 클래스의 기능을 향상시키기 위해 데코레이션 클래스의 메서드를 호출합니다.

인스턴스 :
클래스 다이어그램

Java 디자인 패턴 프로그래밍에서 데코레이터 패턴 사용을 설명하는 예

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 중국어 웹사이트에서 관련 기사를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.