정의: 원본 클래스 파일을 변경하거나 상속을 사용하지 않고 객체의 기능을 동적으로 확장합니다. 감싸는 오브제, 즉 장식물을 생성하여 실물을 감싸는 것입니다.
특징:
(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 중국어 홈페이지를 주목해주세요!