Java Decorator pattern
Section 1. 데코레이터 패턴
1. 데코레이터 패턴 (Decorator pattern)
객체의 결합을 통해 기능을 동적으로 확장하는 패턴으로 기본 기능에 추가 기능인 Decorator 객체를 결합하는 기법
- 자바의 입출력 스트림은 decorator pattern
- 데코레이터는 다른 데코레이터나 또는 컴포넌트를 포함해야 함
2. 컴포넌트와 데코레이터의 구조
- 포함 관계 (Aggregation) - A 클래스에서 B 클래스의 인스턴스를 멤버 변수로 가짐 (A <>→B)
- 원본 데코레이터는 컴포넌트의 Operation() 을 수행
- 확장 데코레이터는 원본 데코레이터의 Operaiont()을 수행하고 자신의 행동 수행
3. 컴포넌트 클래스
- 추상 클래스 Coffee
public abstract class Coffee {
public abstract void brewing();
}
- 추상 클래스 Coffee 를 상속 받은 EtiopiaAmericano
public class EtiopiaAmericano extends Coffee{
@Override
public void brewing() {
System.out.print("EtiopiaAmericano ");
}
}
4. 데코레이터 클래스
- 추상 메서드가 없어도 abstract 지정하여 추상 클래스로 지정
public abstract class Decorator extends Coffee{
Coffee coffee; # 컴포넌트 인스턴스를 멤버변수로 가짐
public Decorator(Coffee coffee){
this.coffee = coffee;
}
@Override
public void brewing() {
coffee.brewing(); # 컴포넌트의 brewing() 메서드 수행
}
}
- 구체적으로 구현한 Latte Decorator
public class Latte extends Decorator{
public Latte(Coffee coffee) {
super(coffee); # 상위 클래스에 기본 생성자가 없기 때문에 super() 호출
}
public void brewing() {
super.brewing(); # 원본 데코레이터 수행
System.out.print("Adding Milk "); # 자신만의 메서드 수행
}
}
- 구체적으로 구현한 Mocha Decorator
public class Mocha extends Decorator{
public Mocha(Coffee coffee) {
super(coffee); # 상위 클래스에 기본 생성자가 없기 때문에 super() 호출
}
public void brewing() {
super.brewing(); # 원본 데코레이터 수행
System.out.print("Adding Mocha Syrup "); # 자신만의 메서드 수행
}
}
5. 데코레이터를 이용한 커피 머신 프로그램
public class CoffeeTest {
public static void main(String[] args) {
EtiopiaAmericano coffee = new Mocha(new Latte(new EtiopiaAmericano()));
coffee.brewing();
}
}
##### 출력 결과 #####
EtiopiaAmericano Adding Milk Adding Mocha Syrup
6. 동작 과정
① Mocha 인스턴스의 coffee.brewing(); 호출
② super.brewing(); 호출
③ coffee.brewing(); 호출
④ Latte 인스턴스의 coffee.brewing(); 호출
⑤ super.brewing(); 호출
⑥ coffee.brewing(); 호출
⑦ EtiopiaAmericano 인스턴스의 brewing(); 호출
⑧ Latte 인스턴스의 print(Adding Milk)
⑨ Mocha 인스턴스의 print(Adding Mocha Syrup)
Author And Source
이 문제에 관하여(Java Decorator pattern), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@codren/Java-Decorator-pattern저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)