개발공부/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();
    }


    }
}

 

========= 출력 ======