티스토리 뷰
출처 링크: https://www.youtube.com/watch?v=GCraGHx6gso&t=1759s
관련 도서: http://www.yes24.com/Product/Goods/1778966
Head First Design Patterns - YES24
정말 쿨~ 하게 배우는 디자인 패턴 학습법다른 사람들이 뭔가를 만들어 놓았고, 누구든 마음대로 사용해도 되는 게 있다면 굳이 고생해서 똑같은 걸 만들어 써야 할 필요는 없을 것이다. 소프트
www.yes24.com
아래 내용은 제 100% 주관적인 내용입니다. 아래 내용이 잘못 되어도 어떠한 책임도 지지 않겠습니다.
비판적으로 내용을 받아들여주세요.
디자인 패턴 UML
디자인 패턴 Sample Code
코드 출처 : https://gdtbgl93.tistory.com/9
public abstract class Beverage {
String description = "no title"; //음료 이름
public abstract int cost();
public String getDescription() {
return description;
}
}
public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}
public class Americano extends Beverage {
public Americano() {
super();
description = "아메리카노";
// TODO Auto-generated constructor stub
}
@Override
public int cost() {
// TODO Auto-generated method stub
return 4000;
}
}
public class CaffeLatte extends Beverage {
public CaffeLatte() {
super();
description = "카페라떼";
// TODO Auto-generated constructor stub
}
@Override
public int cost() {
// TODO Auto-generated method stub
return 5000;
}
}
public class Cream extends CondimentDecorator {
Beverage beverage;
public Cream(Beverage beverage) {
super();
this.beverage = beverage;
}
@Override
public String getDescription() {
// TODO Auto-generated method stub
return beverage.getDescription() + ", 크림";
}
@Override
public int cost() {
// TODO Auto-generated method stub
return beverage.cost() + 500;
}
}
public class Shot extends CondimentDecorator {
Beverage beverage;
public Shot(Beverage beverage) {
super();
this.beverage = beverage;
}
@Override
public String getDescription() {
// TODO Auto-generated method stub
return beverage.getDescription() + ", 샷";
}
@Override
public int cost() {
// TODO Auto-generated method stub
return beverage.cost() + 400;
}
}
내가 느낀 이 패턴의 특징
상속과 컴포지션의 장점을 교묘하게 이용한 영리한 패턴이다.
상속과 컴포지션의 공통점, 각각의 차이점과 장점을 생각해보자.
상속과 컴포지션의 공통점은 코드의 재활용성에 있다. 둘 다 다른 방식이지만 코드를 재활용한다는 공통점이 있다.
하지만 상속은 부모 클래스와 자식 클래스의 인스턴스를 부모 타입으로 추상화 할 수 있다. 부모 타입의 변수만 있다면
자식이 어떤 종류이든 원하는 동작을 하게 할 수 있다는 것이다.
다시한번 간단히 정리하면 두 클래스가 상속 관계라면 타입을 같은 것으로 만드는 효과가 있다.
당연히 컴포지션에는 이런 효과가 없다.
컴포지션은 타입을 같게 할 수는 없지만.. 단일 상속밖에 지원 안되는 자바에서는 다중 상속과 비슷한 역할을 하게 해준다. 상속을 통하지 않더라도 컴포지션을 이용하면 상속과 유사하게 코드를 재활용 할 수 있는 것이다. 이게 별로 대단한 장점이 아닌 것 같지만.. 그렇지 않다. 이 장점이 상속과 결합 된다면.. 컴포지션을 갖는 필드 하나에 여러 종류의 인스턴스를 갈아 끼울 수 있는 엄청난 장점이다.
위의 두 관점으로 디자인 패턴을 하나씩 뜯어보자.
위에서 빨간색으로 묶인 얘들은 Beverage를 상속 받았으므로 Beverage로 같은 타입니다.
마찬가지로 파란색으로 묶인 얘들도 CondimentDecorator를 상속받았으면 CondimentDecorator로 같은 타입이다.
그런데 그런데 CondimentDecorator가 Beverage타입을 상속 받았으므로 사실은 전부다
Beverage로 타입인 것이다.
여기에서 왼쪽 주황색으로 된 클래스들은 Beverage를 상속받은 것 외에는 별다른 기능같은게 없다.
다만 오른쪽 보라색으로 묶인 클래스들은 Beverage를 컴포지션하고 있다.
보라색으로 묶인 클래스들(CondimentDecorator타입)이 Beverage를 컴포지션 하고 있다.
보라색으로 묶인 클래스들(CondimentDecorator타입 = Beverage타입)이 Beverage를 컴포지션 하고 있다. (필드로 가지고 있다.)
즉, 오른쪽 묶인 얘들은 Beverage 타입인데 필드에 Beverage 타입을 가지고 있는다는 소리이다.
자신이 자신의 필드에 자신타입을 가지고 있다는 소리이다.
(이를 필드에 담겨 있는 인스턴스 관점에서 보면 자신을 자신과 같은 타입을 같는 인스턴스가 밖에서 감싸고 있는 형태이다.)
이 개념이 데코레이터 패턴을 만드는 핵심 개념이 되는 것이다.
잘 이해가 됐으면 우리는 주황색으로 묶은 클래스들을 데코레이터 패턴의 중심 알맹이로 쓰고
그 알맹이들(Beverage 타입)을 보라색으로 묶인 클래스들로 감싸면 되는 것이다.
어떨 때 이 패턴을 사용하면 좋을까?
너무 당연하지만.. 수 많은 조합을 만들어야 하고.. 양파 껍질처럼 각 단계별로 구성하고 싶을 때
'개발 > 디자인패턴' 카테고리의 다른 글
옵저버 패턴 - 디자인 패턴 [ep 2] (0) | 2021.10.04 |
---|---|
스트래티지 패턴 - 디자인 패턴 [ep 1] (0) | 2021.09.30 |
브릿지 패턴 - 디자인 패턴 [ep 11] (0) | 2021.09.26 |