ASH84

Software Engineer/Developer, co-founder of Payhere. Ex-Banksalad. Intereseted in iteroperability, bootstrap company, writting.

[Cocoa Design pattern] 23. Decorator

created:2011-07-13
updated:2015-07-03
edit
![](http://ash84.net/wp-content/uploads/1/cfile23.uf.205946374E1D407127DB25.jpg)Β  **λ°μ½”λ ˆμ΄ν„°λž€?** – μ„œλΈŒν΄λž˜μ‹±μ„ 톡해 κΈ°λŠ₯을 μΆ”κ°€ν•˜λŠ” λŒ€μ‹  μ»΄ν¬μ§€μ…˜μ„ ν†΅ν•΄μ„œ κ³΅ν†΅μ μœΌλ‘œ μž¬μ‚¬μš© κ°€λŠ₯ν•œ κΈ°λŠ₯을 객체에 μΆ”κ°€ – μ„œλΈŒ ν΄λž˜μ‹±μ€ 컴파일 λ‹¨κ³„μ—μ„œ μ •μ˜ν•΄μ•Ό ν•˜μ§€λ§Œ, λ°μ½”λ ˆμ΄ν„°λŠ” λŸ°νƒ€μž„ λ‹¨κ³„μ—μ„œ μΆ”κ°€ 및 ꡬ성 κ°€λŠ₯함.Β  ex) NSScrollViewΒ  **νŒ¨ν„΄μ΄ λ§Œλ“€μ–΄μ§„ 동기 ** – κΈ°μ‘΄ 객체에 μ—¬λŸ¬κ°€μ§€ κΈ°λŠ₯을 μΆ”κ°€ν•˜κ³  μ‹ΆμŒ. κ·ΈλŸ¬λ‚˜, 클래슀 수의 증가가 λ¬Έμ œμž„.Β  – μ„œλΈŒ 클래슀 = is – a 관계 Text – RulerText – BorderedRulerText – 상속을 ν†΅ν•΄μ„œ ν•„μš”ν•œ κΈ°λŠ₯을 ν™•μž₯ν•΄ λ‚˜κ°€λŠ” ν˜•νƒœ, νŠΉμ • κΈ°λŠ₯을 μœ„ν•΄ 계측이 λ³΅μž‘ν•΄μ§.Β  – 닀쀑 상속을 ν†΅ν•΄μ„œ κ°„λ‹¨ν•œ 계측을 μ‹œλ„ν•˜μ§€λ§Œ, Β  닀쀑상속은 클래슀의 수λ₯Ό μ€„μ΄λŠ”κ²ƒ λ³΄λ‹€λŠ” 상속 관계λ₯Ό λ°”κΏ”μ€Œ.Β  **λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄μ˜ λͺ©ν‘œΒ **
1. 상속 λŒ€μ‹  μ‘°ν•©μœΌλ‘œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ™μž‘μ„ μ‚¬μš©μžν™” ν•œλ‹€.Β  2. λŸ°νƒ€μž„μ˜ μœ μ—°μ„± 제곡, λŸ°νƒ€μž„ μƒνƒœμ—μ„œ κΈ°λŠ₯을 λ™μ μœΌλ‘œ μΆ”κ°€ 및 제거 κ°€λŠ₯ 3. 클래슀 λŒ€μ‹  각각의 μΈμŠ€ν„΄μŠ€μ— κΈ°λŠ₯을 μΆ”κ°€ν•œλ‹€.Β  4. ν•„μš”ν•œ 클래슀의 수λ₯Ό 쀄여쀀닀.
**νŒ¨ν„΄μœΌλ‘œ 문제 ν•΄κ²°** – μ‘°ν•©(Composition)은 Has – a 관계λ₯Ό μ •μ˜ν•œλ‹€. λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄μ€ μ•”λ¬΅μ μœΌλ‘œ has-a 관계λ₯Ό μ‚¬μš©ν•œλ‹€.Β  ex)Β 
NSClipView μΈμŠ€ν„΄μŠ€κ°€ μžμ‹ μ˜ λ„νλ¨ΌνŠΈ λ·°λ₯Ό λ°μ½”λ ˆμ΄νŠΈν•œλ‹€.Β  = NSClipVIew μΈμŠ€ν„΄μŠ€κ°€ λ„νλ¨ΌνŠΈ λ·°λ₯Ό μ†Œμœ ν•œλ‹€Β  – 쑰합은 λŸ°νƒ€μž„μ‹œμ— κ΅¬μ„±λ˜κ³ , λ™μ μœΌλ‘œ λ°”κΏ€μˆ˜ μžˆλ‹€
*** NSScrollViewΒ  **– setDocumentView λ©”μ†Œλ“œλ₯Ό μ œκ³΅ν•΄μ„œ λ‚΄μž₯된 클립뷰의 λ„νλ¨ΌνŠΈ λ·°λ₯Ό μ„€μ •ν•˜λ„λ‘ 제곡  – λ„νλ¨ΌνŠΈ λ·°λŠ” NSView의 μ„œλΈŒν΄λž˜μŠ€λΌλ©΄ κ°€λŠ₯ 즉, μ‚¬μš©μž μ •μ˜μ˜ μ»€μŠ€ν…€ 뷰도 κ°€λŠ₯ν•˜λ©°, 숫자 μ œν•œμ΄ μ—†λ‹€.Β  **μ½”μ½”μ•„ μ‚¬μš© 예제 **
일반 적인 λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄μ˜ μ‚¬μš© 예제 : [http://mrhook.co.kr/79](http://mrhook.co.kr/79)
– 이 νŒ¨ν„΄μ€ 주둜 MVC의 λ·° 단계 μ—μ„œλ§Œ 주둜 μ‚¬μš©λœλ‹€. – μ˜ˆμ™Έλ„ μžˆλ‹€.Β  **NSAttributedStringΒ  **– NSString + (폰트, 문단 μŠ€νƒ€μΌ, 이미지 λ‚΄μž₯ λ“±λ“±) : 속성을 λ°μ½”λ ˆμ΄νŠΈΒ  – μžμ‹ μ΄ κΎΈλ―ΈλŠ” λ¬Έμžμ—΄μ„ μˆ˜μ •ν•˜μ§€ μ•ŠλŠ”λ‹€. 단지, κ·Έ λ¬Έμžμ—΄κ³Ό μΆ”κ°€ μ •λ³΄λ§Œμ„ ν•¨κ»˜ μ €μž₯함.Β  *365p. ν‘œ23.1 μ€‘μš”ν•œ μ½”μ½”μ•„ λ°μ½”λ ˆμ΄ν„° 클래슀 * **μ•‘μ„Έμ„œλ¦¬ λ·°Β ** – μ½”μ½”μ•„ ν‘œμ€€ μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€ νŒ¨λ„ : μ‚¬μš©μžκ°€ λ§Œλ“  λ°μ½”λ ˆμ΄ν„° μΆ”κ°€ κ°€λŠ₯ν•˜λ‹€.Β  **NSSavePanel, NSColorPanel λ“±λ“±** **–** setAccessoryView λ©”μ†Œλ“œ 제곡 : ν•΄λ‹Ή νŒ¨λ„μ— μ›ν•˜λŠ” μ•‘μ„Έμ„œλ¦¬λ·°λ₯Ό ν‘œμ‹œ ν• μˆ˜ 있음. Β  – ν‘œμ€€ νŒ¨λ„μ€ λ‹€μ–‘ν•œ νŒ¨λ„ 클래슀λ₯Ό μ„œλΈŒ ν΄λž˜μ‹± ν•˜μ§€ μ•Šμ•„λ„ κΈ°λŠ₯을 μΆ”κ°€ ν•  수 μžˆλ‹€Β  *** OS X 10.5 λΆ€ν„° NSPrintPanelκ³Ό NSPageLayout ν΄λž˜μŠ€μ— Β addAccessoryContoller λ©”μ„œλ“œλ‘œ μ•‘μ„Έμ„œλ¦¬λ·°λ₯Ό 관리 ν•˜λŠ” μƒˆλ‘œμš΄ 방식 μ œκ³΅ν•¨.Β ** – μ•‘μ„Έμ„œλ¦¬ λ·°λ₯Ό 직접 μ‚¬μš©ν•˜λŠ” κ²ƒμ—μ„œ μ•‘μ„Έμ„œλ¦¬ λ·° 컨트둀러λ₯Ό μ‚¬μš©ν•˜κ²Œ λ³€ν™”Β  – MVC νŒ¨ν„΄μ˜ μΌκ΄€λœ μ‚¬μš©μ„ μž₯λ €, μ•‘μ„Έμ„œλ¦¬ 뷰와 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ 둜직 사이에 μœ„μΉ˜ν•œ 컨트둀러 μ½”λ“œλ₯Ό 어디에 κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ”μ§€ λͺ…ν™•νžˆ 함.Β  ** νŒ¨ν„΄ μ‚¬μš© κ²°κ³Ό **Β  – 객체지ν–₯의 μƒμ†κ΄€κ³„λŠ” κ°•λ ₯ κ·ΈλŸ¬λ‚˜, μ˜μ‘΄μ„±μ˜ μ›μΈμž„. – μ»΄νŒŒμΌμ‹œ μ •μ μœΌλ‘œ μ„€μ •λ˜κ³ , μ„œλΈŒν΄λž˜μŠ€μ˜ λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ— 영ν–₯을 μ€€λ‹€. – μ»΄ν¬μ§€μ…˜μ€ 보닀 μœ μ—°ν•œ λŒ€μ•ˆμ„ μ œκ³΅ν•¨. – 객체λ₯Ό λŸ°νƒ€μž„μ‹œ ν™•μž₯ν•˜λŠ”κ²ƒμ€ 더 동적이고, ν΄λž˜μŠ€κ°€ μ•„λ‹Œ μΈμŠ€ν„΄μŠ€ λ‹¨μš°μ—μ„œμ˜ 적용이 κ°€λŠ₯ν•˜λ‹€. – λ‹€μˆ˜μ˜ 클래슀 μ‚¬μš©μ„ ν•˜μ§€ μ•Šκ³ λ„ 더 μ»΄ν¬μ§€μ…˜μœΌλ‘œ λ‹€μˆ˜μ˜ κΈ°λŠ₯을 μΆ”κ°€ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.Β  – λ‹€λ₯Έ ν”„λ ˆμž„ μ›Œν¬ μ—μ„œλŠ” λ°μ½”λ ˆμ΄ν„°κ°€ κΎΈλ―ΈλŠ” 객체와 λ™μΌν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 갖도둝 μš”κ΅¬ν•¨.Β  – μ½”μ½”μ•„μ—μ„œλŠ” μ œμ•½μ΄ μ—†μŒ.Β  Β 

#cocoa design pattern  #Composition  #Decorator  #dev  #has-a  #IOS  #is-a  #λ°μ½”λ ˆμ΄ν„°  #μ½”μ½”μ•„ λ””μžμΈ νŒ¨ν„΄