티스토리 뷰

Java

DesignPattern#04 Decorator Pattern

LichKing 2016. 3. 10. 15:04

이번에 알아볼 패턴은 Decorator Pattern(데코레이터 패턴)이다. 구현법이 데코레이터 패턴과 비슷한 패턴들이 몇 존재하므로 구현법으로 구분하려하지말고 목적이 뭔지 잘 파악하는게 중요할듯 하다.

데코레이터 패턴은 전략 패턴(Strategy Pattern)과 마찬가지로 합성(Composite)을 이용하는 패턴이다. 내부적으로 실제 비즈니스로직을 처리하는 객체를 인스턴스변수로 갖고있으면서 해당 비즈니스로직의 처리 결과값을 자신의 이름이 말하든 한번 더 가공해주는 패턴이다.

소스로 확인해보자.


//놀이공원 인터페이스 처음엔 A, B였는데 예제도 진화하고있다...

interface AmusementPark {

public int getTicketCost();    //티켓 값을 반환하는 추상메서드

}

//놀이공원 인터페이스를 구현한 디즈니랜드 클래스

class DisneyLand implements AmusementPark {

@Override

public int getTicketCost(){

return 10000;    //티켓 값은 10000원

}

}


영업 잘하고있었는데 평일 이용객이 너무 적은것같다. 월요일은 20% 할인을 하기로한다.


class MondayDecorator implements AmusementPark {

AmusementPark park;


public MondayDecorator(AmusementPark park){

this.park = park;

}


@Override

public int getTicketCost(){

return (int)park.getTicketCost() * 0.8;

}

}


public class Test {

public static void main(String[] arg){

AmusementPark park = new DisneyLand();


System.out.println("Ticket Cost => " + park.getTicketCost());


park = new MondayDecorator(park);


System.out.println("Ticket Cost => " + park.getTicketCost());

}

}


카드사와 제휴를 통해 할인도 하게됐다. 월요일할인과 중복할인이 적용된다.


class CardDecorator implements AmusementPark {

AmusementPark park;


public CardDecorator(AmusementPark park){

this.park = park;

}


@Override

public int getTicketCost(){

return (int)park.getTicketCost() * 0.9;

}

}


public class Test {

public static void main(String[] arg){

AmusementPark park = new DisneyLand();


System.out.println("Ticket Cost => " + park.getTicketCost());


park = new MondayDecorator(park);


System.out.println("Ticket Cost => " + park.getTicketCost());


park = new CardDecorator(park);


System.out.println("Ticket Cost => " + park.getTicketCost());

}

}


월요일 할인 20% 를 받고 제휴카드 10% 할인까지 받았다.

이런식으로 실제 비즈니스 로직을 처리하는 객체를 인스턴스 멤버로 사용하고 메서드 요청이 들어오면 해당 객체가 처리한 로직에 적절한 가공을 해서 반환해주는게 데코레이터 패턴이다. 

'Java' 카테고리의 다른 글

자바8 용어정리  (1) 2016.09.19
Generics  (7) 2016.05.29
DesignPattern#04 Decorator Pattern  (0) 2016.03.10
DesignPattern#03 Template Callback Pattern  (0) 2016.03.04
DesignPattern#02 Template Method Pattern  (0) 2016.03.02
DesignPattern#01 Strategy Pattern  (0) 2016.03.01
댓글
댓글쓰기 폼