본문 바로가기

객체지향 디자인 패턴

3. 장식(Decorator)패턴

 

장식패턴이 사용되는 경우(문제상황): 어떤 클래스의 전체 객체에 적용하는 것이 아니라 그 클래스의 특정 객체에게만 동적으로 기능(행위)을 적용하고 싶을 때(이 때문에 상속이 아닌 has-a를 통한 메서드의 재정의를 하는 것임) (물론 전략패턴도 이런 측면이 있다. 하지만 앞에서도 말했듯이 장식패턴은 어떤 본연의 기능이 있을때 그것을 없애지 않고 그 위에 추가를 해주는 것이지만 전략패턴은 통째로 바꾸는 것).

디자인 패턴도 역시 패턴이므로 OCP원칙을 저버리지 않는다. 즉 코드의 수정없이 기능을 확장한다.

 

디자인패턴의 형식: 상속과 포함(has-a)을 모두 활용한다(많은 경우 OCP는 DIP를 통해 이루어지고 DIP는 느슨한 has-a를 통해 이루어진다)

(상속과 포함이 구체적으로 어떻게 활용되는지는 같은 장식패턴이라 하더라도 그 구체적인 계층도는 달라질 수 있다. (학교 예제인 Decorator-Coffee01, 02를 비교해서 살펴보는 것이 중요하다. 여기서 기억해 둘것은 인터페이스의 구현도 상속이라고 여겨질수 있다는 것이다)

 

장식패턴이라는 것이 어떠한 클래스의 여러객체들중 특정객체에게만 다양한 기능을 적용하는 것이다. 이런 맥락에서 Decorator-Coffee02번 예제는 엄밀한 의미에서는 장식패턴도, 전략패턴도 아니다. 하지만 OCP원칙을 지켜내며 훌륭히 문제를 해결하고 있는 코드입니다.

 

왜 장식패턴에서 상속으로 메서드를 재정의 하지 않고 has-a를 통해서만 메서드를 재정의 해야하나?:

1. 상속을 통해 메서드를 재정의하면 중간에 추상클래스를 둘수 없음. 왜? super키워드를 이용해 호출해야 하는데 추상클래스가 막아버림

 

2. 상속을 통해 메서드를 재정의하면  클래스 폭발 문제가 일어남.

(2번 문제의 구체적 예로) 클래스의 인스턴스중 어떠한 한 인스턴스를 특별하게 사용하기 위해서는 그 특별한 클래스를 또 만들어야함: 예를들어 모카 100개 탄 커피 만든다 하면 상속 100번한 클래스를 만들어야 하는 꼴.

 

3. 어떤 클래스의 전체 객체에 적용하는 것이 아니라 그 클래스의 특정 객체에게만 동적으로 기능(행위)을 적용하기 위해

 

왜 2,3번과 같은 문제가 발생하나? has-a는 특정객체에게만 새 기능을 추가해 줄수 있지만 상속은 클래스에 적용되기 때문에 그러하다!

 

(복습.

전략 패턴은 언제 쓰이나? 

1. 실행시간에 클라이언트 클래스가 가지는 하나 혹은 다수의 종류의 전략을 실행시간에 변경하고자 할때. 

2.한 클래스혹은 메서드가 여러 행위를 조건문을 통해 정의할때 

전략 패턴의 형식은 어떻게 되나?
각각의 전략을 클라이언트 클래스와 분리하여 전략 인터페이스와 전략 클래스로 구현하고 클라이언트 클래스(Context class)들은 그 느슨한 결합을 위해 그 전략 인터페이스를 맴버로 갖는다(has-a)


관찰자 패턴은 언제 쓰이나?
관찰자가 관심 있어 하는 사건의 발생을 관찰대상이 알려줘야 할때. 

관찰자 패턴의 형식은 어떻게 되나? 
관찰대상은 관찰자들을 유지하기 위한 컬랙션 자료구조 멤버변수를 가짐. OCP를 지키기 위해서 느슨한 관계의 has-a로 컬랙션 자료구조는 그 타입으로 관찰자 인터페이스를 취한다. 
관찰자가 자기자신을 관찰대상에 등록해 놓음.)

 

'객체지향 디자인 패턴' 카테고리의 다른 글

[UML] 클래스 다이어그램 (Class Diagram)  (0) 2023.11.04
생성패턴  (0) 2023.10.15
디자인 패턴(Design Pattern)이란?  (0) 2023.10.05
2. Strategy Pattern  (0) 2023.09.04
1. Singleton pattern  (0) 2023.09.04