>  기사  >  Java  >  Java 데코레이터 패턴을 쉽게 마스터하세요

Java 데코레이터 패턴을 쉽게 마스터하세요

高洛峰
高洛峰원래의
2017-01-19 16:02:531091검색

정의: 원본 클래스 파일을 변경하거나 상속을 사용하지 않고 객체의 기능을 동적으로 확장합니다. 감싸는 오브제, 즉 장식물을 생성하여 실물을 감싸는 것입니다.

특징:

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

(2) 장식된 객체에는 실제 객체에 대한 참조가 포함됩니다.

(3) 장식된 객체는 클라이언트의 모든 요청을 수락합니다. 이러한 요청을 실제 객체로 전달합니다.

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

공용 프레임워크에서의 엔터프라이즈급 개발 및 애플리케이션: IO 스트림 기반 아키텍처

구성:

(1) 추상 컴포넌트(Component) 역할: 추상 인터페이스 제공, 준비 추가 책임을 받기 위한 사양이 있는 개체입니다.
(2) 구체적인 구성 요소 역할: 추가 책임을 맡을 클래스를 정의합니다.
(3) 데코레이터 역할: 컴포넌트 객체의 인스턴스를 보유하고 추상 컴포넌트 인터페이스와 일치하는 인터페이스를 구현합니다.
(4) 콘크리트 데코레이터 역할: 구성 요소 개체에 추가 책임을 추가하는 역할을 담당합니다.

구체적인 예:

/**
 * 以下装饰房子举例
 */
public class Demo {
 
 public static void main(String[] args) {
 GenericHouse house = new GenericHouse();
 Garage garage = new Garage(house);
 garage.doSomething();
 Kitchen kitchen = new Kitchen(house);
 kitchen.doSomething();
 }
}
 
/**
 * 抽象构件角色:一个接口,用以规范具体装饰的位置 
 */
interface AbstractHouse{
 public void doSomething();
}
 
/**
 * 装饰角色: 持有要装饰的对象
 */
class Master implements AbstractHouse{
  
 private AbstractHouse abstractHouse;
 
 public Master(AbstractHouse abstractHouse) {
 this.abstractHouse = abstractHouse;
 }
  
 public void doSomething() {
 System.out.println("装饰角色:装饰角色持有者,在这儿就是房子的主人");
 abstractHouse.doSomething();
 }
  
}
 
/**
 * 具体的构件角色:具体需要被装饰的对象 
 */
class GenericHouse implements AbstractHouse{
 public void doSomething() {
 System.out.println("具体构建角色:房子可以住人,遮风挡雨!");
 }
}
 
/**
 * 具体装饰角色: 具体的装饰就是在这儿做的,它继承自装饰角色,因为装饰角色持有被装饰对象,
 * 所以它也就持有了被装饰对象,可以做装饰
 */
class Garage extends Master{
 
 public Garage(AbstractHouse abstractHouse) {
 super(abstractHouse);
 }
  
 public void doSomething() {
 super.doSomething();
 System.out.println("具体装饰角色:在这儿做装饰的事儿,把房子中的一间装饰成车库,所以房子可以存放车子了");
 }
}
/**
 * 具体装饰角色: 具体的装饰就是在这儿做的,它继承自装饰角色,因为装饰角色持有被装饰对象,
 * 所以它也就持有了被装饰对象,可以做装饰
 */
class Kitchen extends Master{
 
 public Kitchen(AbstractHouse abstractHouse) {
 super(abstractHouse);
 }
  
 public void doSomething() {
 super.doSomething();
 System.out.println("具体装饰角色:在这儿做装饰的事儿,把房子中的一间装饰成厨房,所以房子可以做饭了");
 }
}

실제 개발에서는 패턴으로 장식된 패키징 기능이 큰 역할을 합니다. 원래 개체를 변경하지 않고도 개체에 다른 작업을 수행할 수 있습니다. 객체를 변형하는 것을 피하는 동시에 일부 작업을 잘 완료할 수 있습니다.

위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되기를 바랍니다.

자바 데코레이터 패턴을 쉽게 익히는 방법에 대한 더 많은 글은 PHP 중국어 홈페이지를 주목해주세요!

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