객체의 기능을 향상하거나 향상시키고 싶지만 클래스를 상속하고 하위 클래스를 만들고 싶지 않은 경우 데코레이션 모드 사용을 고려할 수 있습니다.
장식 모드를 사용하여 객체의 특정 기능을 강화하는 것은 하위 클래스를 생성한 다음 강화하는 것보다 더 유연합니다.
1) 추상 컴포넌트: "데코레이터"를 "장식"해야 하는 메서드를 정의하는 추상 클래스를 정의합니다.
2) 콘크리트 컴포넌트: 추상 컴포넌트의 하위 클래스입니다. "장식된 클래스"가 됩니다
3) 장식 컴포넌트: 추상 컴포넌트의 하위 클래스이기도 합니다. 이 클래스는 "데코레이터"에 대한 참조를 보유하며 데코레이터의 메서드를 호출하는 데 사용됩니다. 추상 클래스일 수도 있고 비추상 클래스일 수도 있습니다.
4) 콘크리트 데코레이션 클래스: "데코레이터"라고 하는 데코레이션 컴포넌트의 하위 클래스입니다.
1) 추상 컴포넌트
/** * 抽象组件,定义了被装饰类需要装饰的方法 */ public abstract class ICake { /** * 需要装饰的方法 * @return */ public abstract int getPrice(); }
2) 데코레이터
/** * 被装饰者,是抽象组件的一个子类,定义需要被装饰的方法 */ public class Cake extends ICake { /** * 被装饰类中,装饰方法的基本实现 * @return */ @Override public int getPrice() { System.out.println("getPrice"); return 100; } }
3) 데코레이션 클래스
/** * 装饰类,也是抽象组件的一个子类。 * 可以是抽象类,也可以是非抽象类。 */ public abstract class CakeDecorator extends ICake { /** * 被装饰类的引用,需要在装饰类中,调用到被装饰类的方法。 */ ICake cake; public CakeDecorator(ICake cake){ this.cake = cake; } }
4) 특정 장식
/** * 具体装饰类 */ public class BlueBerryCake extends CakeDecorator { public BlueBerryCake(ICake cake) { super(cake); } /** * 被装饰的方法 * 在调用到被装饰类的基础方法后,还要调用装饰类要增强的方法 * @return */ @Override public float getPrice(){ return cake.getPrice()+elsePrice(); } /** * 增强的方法 * @return */ private float elsePrice(){ System.out.println("else getPrice"); return 50; } }
5) 테스트 클래스
public class TestDecorator { public static void main(String args[]){ ICake cake = new Cake(); CakeDecorator decorater = new BlueBerryCake(cake); float price = decorater.getPrice(); System.out.println(price); } }
1) 특정 메서드의 향상은 하위 클래스 상속을 사용하여 달성할 수도 있습니다. 데코레이션 모드를 통해 구현하는 것과 비교했을 때 데코레이션 모드의 장점은 무엇인가요?
데코레이터와 데코레이터는 느슨하게 결합되어 있습니다. 장식 클래스는 추상 구성 요소에만 의존하며, 장식 클래스는 어떤 하위 클래스인지는 모르고 장식된 클래스가 추상 구성 요소의 하위 클래스라는 것만 알면 됩니다.
데코레이션 모드는 "개방-폐쇄 원칙"을 만족하며, 특정 컴포넌트를 수정하지 않고도 컴포넌트에 대한 데코레이션 클래스를 추가할 수 있습니다.
java.IO 패키지의 많은 클래스는 데코레이션 모드를 사용합니다.
Reader
FileReader
BufferedReader
위 내용은 Java 디자인 패턴에서 데코레이션 패턴의 원리와 구현 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!