
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 변수에 담긴 것과 동일할 필요가 없다.