본문 바로가기
Spring/디자인패턴

Decorator pattern(데코레이터 패턴)

by 미눅스[멘토] 2023. 7. 24.
728x90

데코레이터 패턴은 기존 뼈대(클래스)는 유지하되, 이후 필요한 형태로 꾸밀 때 사용한다. 확장이 필요한 경우 상속의 대안으로도 활용 한다. SOUD중에서 개방폐쇄 원칙(OCP)과 의존 역전 원칙(DIP)를 따른다.

 

 

 

 

 

ex)케이크

케이크에 초코를 바르면 초코케이크 가 되고 딸기를 넣으면 딸기 케이크가 된다. 이렇게

원본을 유지하되 어떤것을 씌우냐, 다른것을 첨가하느냐에 따라 다른 형태로 확장되는것을

데코레이터 패턴이라고 한다.

 

 

 

ICar(인터페이스)

package Muzi.decorator;

public interface ICar {

	int getPrice();
	void showPrice();
}

 

Audi(클래스) = ICar(상속)

package Muzi.decorator;

public class Audi implements ICar{

	private int price;
	
	public Audi(int price) {
		this.price = price;
	}
	
	@Override
	public int getPrice() {
		return price;
	}

	@Override
	public void showPrice() {
		System.out.println("audi 의 가격은 "+ this.price + "원 입니다.");
	}
}

 

AudiDecorator(클래스) = ICar(상속)

package Muzi.decorator;

public class AudiDecorator implements ICar{

	
	protected ICar audi;
	protected String modelName;
	protected int modelPrice;
	
	public AudiDecorator(ICar audi, String modelName, int modelPrice) {
		this.audi = audi;
		this.modelName = modelName;
		this.modelPrice = modelPrice;
	}
	
	
	@Override
	public int getPrice() {
		return audi.getPrice() + modelPrice;
	}

	@Override
	public void showPrice() {
		System.out.println(modelName + "의 가격은" + getPrice() + "원 입니다.");
	}

}

 

A3(클래스) = AudiDecorator(상속)

package Muzi.decorator;

public class A3 extends AudiDecorator{

	public A3(ICar audi, String modelName) {
		super(audi, modelName, 1000);
	}

}

 

A4(클래스) = AudiDecorator(상속)

package Muzi.decorator;

public class A4 extends AudiDecorator{

	public A4(ICar audi, String modelName) {
		super(audi, modelName, 2000);
	}

}

 

A5(클래스) = AudiDecorator(상속)

package Muzi.decorator;

public class A5 extends AudiDecorator{

	public A5(ICar audi, String modelName) {
		super(audi, modelName, 3000);
	}

}

 

Main(클래스)

package Muzi;

import Muzi.decorator.A3;
import Muzi.decorator.A4;
import Muzi.decorator.A5;
import Muzi.decorator.Audi;
import Muzi.decorator.ICar;

public class Main {
	public static void main(String[] args) {
		ICar audi = new Audi(1000);
		audi.showPrice();
		
		
		//a3
		ICar audi3 = new A3(audi, "A3");
		audi3.showPrice();
		//a4
		ICar audi4 = new A4(audi, "A4");
		audi4.showPrice();
		//a5
		ICar audi5 = new A5(audi, "A5");
		audi5.showPrice();
	}
}

 

 

콘솔에 보면

audi의 가격이 모델이 올라갈 때마다 1000원 씩 늘어난 것을 볼 수 있다.

이렇게 audi라는 기본 베이스를 두고

등급이 올라갈 때마다 가격을 +시키는 decorating을 했다.

 

이렇게 데코레이터 패턴을 통해서

뼈대는 건들지 않고 부가적인 첨가를 하면서

속성을 변환시키는 것을 데코레이터 패턴 이라고 한다.

'Spring > 디자인패턴' 카테고리의 다른 글

Facade Pattern(파사드 패턴)  (0) 2023.07.24
ObserverPattern(옵저버 패턴)  (0) 2023.07.24
Proxy pattern(프록시 패턴)  (0) 2023.07.21
Adapter Pattern(어댑터 패턴)  (0) 2023.07.19
Singleton pattern(싱글톤 패턴)  (0) 2023.07.19