이 글은 주로 자바 데코레이터 패턴을 소개하고, 데코레이터 패턴의 원리와 자바 특유의 구현 기법을 예제 형식으로 자세히 분석하고 있습니다. 필요한 친구들이 참고할 수 있습니다.
이 글은 자바 데코레이터 패턴을 예시로 설명합니다. 참조용으로 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.
장식 모드
원본 클래스 파일을 변경하거나 상속을 사용하지 않고 객체의 기능을 동적으로 확장합니다. 감싸는 오브제, 즉 장식물을 생성하여 실물을 감싸는 것입니다.
장식된 개체는 클라이언트의 모든 요청을 받아들입니다. 이러한 요청을 실제 객체로 전달합니다. 장식된 개체는 이러한 요청을 전달하기 전이나 후에 추가 기능을 추가할 수 있습니다.
이렇게 하면 특정 개체의 구조를 수정하지 않고도 런타임 시 외부에서 추가 기능을 추가할 수 있습니다. 객체 지향 설계에서 특정 클래스의 기능 확장은 일반적으로 상속을 통해 구현됩니다.
장점
1. Decorator 모드와 상속 관계의 목적은 객체의 기능을 확장하는 것이지만 Decorator 모드는 상속보다 더 많은 유연성을 제공할 수 있습니다.
2. 다양한 특정 데코레이션 클래스와 이러한 데코레이션 클래스의 배열 및 조합을 사용하여 디자이너는 다양한 동작의 다양한 조합을 만들 수 있습니다.
Role
데코레이션 모드의 다양한 역할은 다음과 같습니다.
(1) 추상 컴포넌트(Component) 역할: 추가 책임을 받을 준비가 된 객체를 표준화하기 위한 추상 인터페이스를 제공합니다.
(2) 구체적인 구성 요소 역할: 추가 책임을 맡을 클래스를 정의합니다.
(3) 데코레이터 역할: 구성 요소 개체의 인스턴스를 보유하고 추상 구성 요소 인터페이스와 일치하는 인터페이스를 구현합니다.
(4) 콘크리트 데코레이터 역할: 구성 요소 개체에 추가 책임을 추가하는 역할을 담당합니다.
예제 코드
핸드 케이크를 예로 들어보겠습니다. 핸드 케이크는 다양한 맛이 있을 수 있지만, 가장 기본적인 것은 오리지널 핸드 케이크입니다. 또는 고기와 같은 더 많은 조합.
추상 컴포넌트 역할
package 装饰者模式; /** * 抽象类接口,规范饼的属性 * @author oooo * */ public interface Cake { //两个属性 public String descripestion(); //属性描述 public Double money(); //价格描述 }
콘크리트 컴포넌트 역할
package 装饰者模式; /** * 原味手抓饼类 * @author oooo *负责接收附加属性的类 */ public class shreddedcake implements Cake{ //实现Cake接口 @Override public String descripestion() { //描述属性 return "原味手抓饼"; } @Override public Double money() { //描述价格 return 3.5; } }
데코레이터 역할
package 装饰者模式; /** * 建立和饼的连接,得到原始饼的属性,添加属性的中介。 * @author oooo * */ public abstract class Deractor implements Cake{ Cake cake; public Deractor(Cake cake) { this.cake=cake; } public String descripestion(){ return cake.descripestion(); } public Double money(){ return cake.money(); } }
콘크리트 데코레이터 역할
package 装饰者模式; /** * 鸡蛋手抓饼类 * @author oooo *添加鸡蛋属性 */ public class EggshrededCake extends Deractor{ public EggshrededCake(Cake cake) { super(cake); } public String descripestion() { return "鸡蛋"+cake.descripestion(); } @Override public Double money() { return 3.5+1.5; } }
콘크리트 데코레이터 역할
package 装饰者模式; /** * 牛肉味手抓饼 * @author oooo *添加牛肉属性 */ public class beffshredded extends Deractor{ public beffshredded(Cake cake) { super(cake); // TODO Auto-generated constructor stub } public String descripestion() { return "牛肉"+cake.descripestion(); } @Override public Double money() { return cake.money()+3.0; } }
클래스
package 装饰者模式; public class Test { /** * 测试类 * @param args */ public static void main(String[] args) { //新建一个原味手抓饼类 shreddedcake sh=new shreddedcake(); System.out.println(sh.descripestion()); System.out.print(" 价格: "+sh.money()); //新建一个鸡蛋类,附加鸡蛋属性到手抓饼上 EggshrededCake egg=new EggshrededCake(sh); System.out.println(egg.descripestion()); System.out.print(" 价格:"+egg.money()); //新建一个牛肉类,附加牛肉属性到手抓饼上 beffshredded beff=new beffshredded(egg); System.out.println(beff.descripestion()); System.out.print(" 价格:"+beff.money()); } }
의 테스트 출력 결과:
原味手抓饼 价格: 3.5 鸡蛋原味手抓饼 价格:5.0 牛肉鸡蛋原味手抓饼 价格:8.0
위 내용은 Java 데코레이터 패턴 상세 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!