개발공부/Java
[Java] 데코레이터(Decorator) 패턴
환타몬
2022. 2. 7. 01:39
데코레이터 패턴은 기존 뼈대 (클래스)는 유지하되, 이후 필요한 형태로 꾸밀 때 사용한다.
확장이 필요한 경우 상속의 대안으로도 활용한다. SOLID 중에서 개방폐쇄 원칙 (OCP0과 의존 역전 원칙 (DIP)를 따른다.
ICar.java
package com.company.design.decorator;
public interface ICar {
int getPrice();
void showPrice();
}
- AudiDecorator
package com.company.design.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() + "원 입니다.");
}
}
- Audi.java
package com.company.design.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+"원입니다.");
}
}
A3.java
package com.company.design.decorator;
public class A3 extends AudiDecorator{
public A3(ICar audi, String modelName) {
super(audi, modelName, 1000);
}
}
A4.java
package com.company.design.decorator;
public class A4 extends AudiDecorator{
public A4(ICar audi, String modelName) {
super(audi, modelName, 2000);
}
}
A5.java
package com.company.design.decorator;
public class A5 extends AudiDecorator{
public A5(ICar audi, String modelName) {
super(audi, modelName, 3000);
}
}
Main.java
package com.company.design;
import com.company.design.adapter.*;
import com.company.design.aop.AopBrowser;
import com.company.design.decorator.*;
import com.company.design.proxy.Browser;
import com.company.design.proxy.BrowserProxy;
import com.company.design.proxy.IBrowser;
import com.company.design.singleton.AClazz;
import com.company.design.singleton.BClazz;
import com.company.design.singleton.SocketClient;
import java.util.concurrent.atomic.AtomicLong;
public class Main {
public static void main(String[] args){
ICar audi = new Audi(1000);
audi.showPrice();
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();
}
}
}
========= 출력 ======