GoF의 디자인 패턴, 장식자 패턴에 대해 알아본다.
해당 글은, 다음의 코드를 기반으로 이해하는 것이 편리합니다.
Strings
: 장식할 대상이 되는 class. 문자열을 여러개 가지고 있음Decorator
: 장식을 하는 interfaceStrings
와 Decorator
가 같은 Item
interface를 상속받도록 하여String
)과 장식(Decorator
)에 대한 구분을 없애 동일하게 다룰 수 있다.// Strings
HI H.I.~!
I'm Wansook kun~!
I'm iOS Developer!
Design Pattern is not so good as much as before!
// Side Decorator
"HI H.I.~!"
"I'm Wansook kun~!"
"I'm iOS Developer!"
"Design Pattern is not so good as much as before!"
// Line Number Decorator
00: HI H.I.~!
01: I'm Wansook kun~!
02: I'm iOS Developer!
03: Design Pattern is not so good as much as before!
// Box Number Decorator
+------------------------------------------------+
|HI H.I.~! |
|I'm Wansook kun~! |
|I'm iOS Developer! |
|Design Pattern is not so good as much as before!|
+------------------------------------------------+
internal func main() {
let strings = Strings()
strings.add(item: "HI H.I.~!")
strings.add(item: "I'm Wansook kun~!")
strings.add(item: "I'm iOS Developer!")
strings.add(item: "Design Pattern is not so good as much as before!")
var decorator: Item = SideDecorator(item: strings, side: "\"")
decorator = LineNumberDecorator(item: decorator)
decorator = BoxDecorator(item: decorator)
decorator.printContent()
}
// Mix
+------------------------------------------------------+
|00: "HI H.I.~!" |
|01: "I'm Wansook kun~!" |
|02: "I'm iOS Developer!" |
|03: "Design Pattern is not so good as much as before!"|
+------------------------------------------------------+
Item
): 동적으로 추가할 서비스를 가질 가능성이 있는 객체들에 대한 인터페이스Strings
): 실제로 정의되어야할 필요가 있는 클래스Decorator
): 객체에 대한 참조자를 관리하면서 Component에 정의된 인터페이스를 만족하도록 인터페이스를 정의(?)BorderDecorator
, ScrollDecorator
): Component에 적용할 장식을 실제로 구현하는 클래스Item
)으로 먼저 요청을 전달한다.Strings
)에 decorator가 3번 중첩 적용되었다.Item
이라는 구성요소를 가지고 있는데,Item
으로 받고 있기 때문이다.Strings
)와 실제 decorator의 item
변수에 담긴 것과 동일할 필요가 없다.