본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


DesignPattern

디자인 패턴 5 - decorator pattern

반응형

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

  

 

자동차를 예시로 decorator pattern을 알아보자

 

ICar 인터페이스

public interface ICar {
    int getPrice();
    void showPrice();
}

 

ICar 인터페이스는 Car 클래스의 뼈대 역할을한다 가격을 리턴하는 getPrice() 와 가겨을 출력하는 showPrice()

두 메서드를 가지고 있다. 

 

Audi 클래스

 

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+"원 입니다.") ;
    }
}

 

Audi 클래스는 ICar를 구현하고 필드로 Int 타입의 price를 갖는다. 

 

여기서 Audi에  A3,A4,A5 모델이 있고  모델마다 가격이 달라진다고 가정하자

이런 상황에서 decorator pattern을 사용할 수 있다.  

 

AudiDecorator 클래스

 

package com.company.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()+"원 입니다.");
    }
}

AudiDecorator 클래스는 Audi클래스를 decorator pattern으로 변형한 클래스이다

 

AudiDecorator를 활용해  아래와 같이 여러가지 모델을 만들어낼 수 있으며 만들어지는 클래스들은 AudiDecorator를 상속받아 구현되며 필요에 따라 AudiDecorator의 메소드인 getPrice와 showPrice를 Overriding할 수 있다 .

 getPrice() 메서드를 통해 기본 가격에서 모델이 올라갈 수록 가격이 추가 된다(A3는 1000원 , A4는 2000원 ,A5는 3000원). 

 

A3 클래스

 

package com.company.decorator;

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

 

 

A4 클래스

 

package com.company.decorator;

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

 

 

A5 클래스

 

package com.company.decorator;

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

 

메인메서드에서 위의 클래스를 사용해보면 아래와 같다.

 

메인메서드

 

public class Main {

        //decorator pattern

        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();
    }

}

 

Icar 타입 audi 의 파라미터인 가격으로 1000원을 전달하고 showPrice로 가격을 출력해보면 결과는 아래와 같다.

 

결과

 

audi의 가격은 1000원 입니다.
A3의 가격은2000원 입니다.
a4의 가격은3000원 입니다.
a5의 가격은4000원 입니다.

 

위의 예시와 같이 하나의  클래스를 여러가지 형태로 구현해야할 때 Decorator pattern이 사용된다.

 

반응형