기존 클래스는 유지하되, 이후 필요한 형태로 꾸밀대 사용한다. 확장이 필요한 경우 상속의 대안으로도 활용한다.
SOLID중 개방 폐쇄의 원칙과 의존 역전 원칙을 따른다
차량의 가격을 가져오고 보여주는 인터페이스 생성
package com.company.design.dedorator;
public interface ICar {
int getPrice();
void showPrice();
}
인터페이스를 상속받은 기본클래스( 자동차)를 생성 및 가격을 정해준다.
package com.company.design.dedorator;
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+"원 입니다.");
}
}
인터페이스를 상속받아 기본 차량의 가격을받아오고 가격을 보여주는 데코레이터 클래스 생성
package com.company.design.dedorator;
public class NewAudiDecorator implements ICar{
protected ICar audi;
protected String modelName;
protected int modelPrice;
public NewAudiDecorator(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()+"원 입니다.");
}
}
차량의 종류에 따른 가격을 설정해준다. 이때 extends를 사용하여 데코레이터를 적용 시켜 준다.
package com.company.design.dedorator;
public class A3 extends NewAudiDecorator{
public A3(ICar audi, String modelName) {
super(audi, modelName,1000);
}
}
package com.company.design.dedorator;
public class A4 extends NewAudiDecorator{
public A4(ICar audi, String modelName) {
super(audi, modelName,2000);
}
}
package com.company.design.dedorator;
public class A5 extends NewAudiDecorator{
public A5(ICar audi, String modelName) {
super(audi, modelName,3000);
}
}
차량 제조사와 차량의 이름만 입력 받으면 각각 다른 가격이 출력된다.
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();
// 45
ICar audi5 = new A5(audi, "A5");
audi5.showPrice();
}
}
파사드 패턴 (0) | 2022.08.03 |
---|---|
옵저버 패턴 (0) | 2022.08.03 |
프록시 패턴 (0) | 2022.08.02 |
Adapter pattern (0) | 2022.08.01 |
Singleton pattern (0) | 2022.08.01 |