Chapter 01. Iterator - 하나씩 열거하면서 처리한다 ... 37 01. Iterator 패턴 ... 38 02. 예제 프로그램 ... 39 Aggregate 인터페이스 ... 39 Iterator 인터페이스 ... 41 Book 클래스 ... 42 BookShelf 클래스 ... 42 BookShelf Iterator 클래스 ... 43 Main 클래스 ... 44 03. Iterator 패턴에 등장하는 역활 ... 46 04. 독자의 사고를 넓혀주는 힌트 ... 47 구현에 상관없이 Iterator를 사용할 수 있다. ... 47 추상 클래스나 인터페이스는 아무래도 서툴러서 ... 48 Aggregate와 Iterator의 대응 ... 48 'Next'는 착각하기 쉽다 ... 49 'hasNext'도 착각하기 쉽다 ... 49 다수의 Iterator ... 49 다양한 종류의 Iterator ... 49 deleteIterator는 필요 없다 ... 50 05. Iterator 패턴과 관련된 패턴 ... 50 06. 이장에서 학습한 내용 ... 50 연습문제 ... 51 chapter 02. Adapter - 필요한 형태로 수정해서 재활용한다 ... 53 01. Adapter 패턴 ... 54 02. 예제 프로그램 (1) (상속을 이용한 것) ... 55 Banner 클래스 ... 56 Print 인터페이스 ... 57 PrintBanner 클래스 ... 57 Main 클래스 ... 58 03. 예제 프로그램 (2) (위임을 사용한 것) ... 59 Print 클래스 ... 60 PrintBanner 클래스 ... 60 04. Adapter 패턴에 등장하는 역할 ... 61 05. 독자의 사고를 넓혀주는 힌트 ... 62 어떤 경우에 사용할까 ... 62 만약 소스가 없더라도 ... 63 버전업과 호환성 ... 63 기능이 동떨어진 클래스 ... 63 06. Adapter 패턴과 관련된 패턴 ... 64 Bridge 패턴(9장) ... 64 Decorator 패턴(12장) ... 64 07. 이 장에서 학습한 내용 ... 64 연습문제 ... 65 Chapter 03. Template Method - 구체적인 처리를 하위 클래스에게 위임 ... 69 01. Template Method 패턴 ... 70 템플릿이란? ... 70 Template Method 패턴 ... 70 02. 예제 프로그램 ... 71 AbstractDisplay 클래스 ... 72 CharDisplay 클래스 ... 73 StringDisplay 클래스 ... 74 Main 클래스 ... 75 03. Template Method 패턴에 등장하는 역할 ... 76 04. 독자의 사고를 넓혀주는 힌트 ... 77 로직을 공통화할 수 있다 ... 77 상위 클래스와 하위 클래스의 제휴 ... 78 하위 클래스를 상위 클래스와 동일시한다 ... 78 05. Template Method 패턴과 관련된 패턴 ... 78 06. 보강 : 클래스 계층과 추상 클래스 ... 79 상위 클래스가 하위 클래스에게 요청 ... 79 추상 클래스의 의의 ... 79 상위 클래스와 하위 클래스의 협조 ... 80 07. 이 장에서 학습한 내용 ... 80 연습문제 ... 81 Chapter 04. Factory Method - 인스턴스 작성을 하위 클래스에게 위임 ... 83 01. Factory Method 패턴 ... 84 02. 예제 프로그램 ... 84 03. Product 클래스 ... 86 Factory 클래스 ... 86 IDCard 클래스 ... 87 IDCardFactory 클래스 ... 87 Main 클래스 ... 88 04. Factory Method 패턴에 등장하는 역할 ... 89 05. 독자의 사고를 넓혀주는 힌트 ... 90 프레임워크와 구체적인 내용 ... 90 인스턴스 생성 - 메소드의 구현 방법 ... 91 패턴 이용과 개발자간의 의사소통 ... 92 06. Factory Method 패턴과 관련된 패턴 ... 93 07. 이 장에서 학습한 내용 ... 93 연습문제 ... 94 Chapter 05. Singleton - 단 하나의 인스턴스 ... 95 01. Singleton 패턴 ... 96 02. 예제 프로그램 ... 97 Singleton 클래스 ... 97 Main 클래스 ... 98 03. Singleton 패턴에 등장하는 역할 ... 99 04. 독자의 사고를 넓혀주는 힌트 ... 100 왜 제한할 필요가 있는가 ... 100 유일한 하나의 인스턴스는 언제 생성되는가 ... 100 05. Singleton 패턴과 관련된 패턴 ... 100 06. 이 장에서 학습한 내용 ... 101 연습문제 ... 101 Chapter 06. Prototype - 복사해서 인스턴스를 만든다 ... 103 01. Prototype 패턴 ... 104 02. 예제 프로그램 ... 105 Product 인터페이스 ... 106 Manager 클래스 ... 107 MessageBox 클래스 ... 108 UnderlinePen 클래스 ... 109 Main 클래스 ... 110 03. Prototype 패턴에 등장하는 역할 ... 112 04. 독자의 사고를 넓혀주는 힌트 ... 113 클래스에서 인스턴스를 만들면 안되는 것일까 ... 113 클래스 명은 속박인가 ... 114 05. Prototype 패턴과 관련된 패턴 ... 114 06. 보강 : clone 메소드와 java.lang.Cloneable 인터페이스 ... 115 자바 언어의 clone ... 115 clone 메소드는 어디에서 정의되어 있는가? ... 116 cloneable이 요구하는 메소드는? ... 116 clone 메소드는 피상적인 복사를 합니다 ... 116 07. 이 장에서 학습한 내용 ... 117 연습문제 ... 118 Chapter 07. Builder - 복잡한 인스턴스를 조립한다 ... 119 01. Builder 패턴 ... 120 02. 예제 프로그램 ... 120 Builder 클래스 ... 121 Director 클래스 ... 122 TextBuilder 클래스 ... 123 HTMLBuilder 클래스 ... 124 Main 클래스 ... 125 03. Builder 패턴에 등장하는 역할 ... 127 04. Builder 패턴과 관련된 패턴 ... 129 05. 독자의 생각을 넓혀주는 힌트 ... 130 클래스가 알고 있는 것은 무엇인가 ... 130 설계시에 결정할 수 있는 것과 결정할 수 없는 것 ... 130 소스를 읽는 법과 수정하는 방법 ... 131 06. 이 장에서 학습한 내용 ... 131 연습문제 ... 132 Chapter 08. Abstract Factory - 관련된 부품을 조립해서 제품을 만든다 ... 133 01. Abstract Factory 패턴 ... 134 02. 예제 프로그램 ... 135 추상적인 부품 : Item 클래스 ... 139 추상적인 부품 : Link 클래스 ... 139 추상적인 부품 : Tray 클래스 ... 140 추상적인 제품 : Page 클래스 ... 140 추상적인 공장 : Factory 클래스 ... 142 공장을 사용해서 부품을 조립하여 제품을 만든다 : Main 클래스 ... 143 구체적인 공장 : ListFactory 클래스 ... 144 구체적인 부품 : ListLink 클래스 ... 145 구체적인 부품 : ListTray 클래스 ... 146 구제적인 제품 : ListPage 클래스 ... 147 03. 예제 프로그램에 별도의 구체적인 공장을 추가 ... 148 구체적인 공장 : TableFactory 클래스 ... 150 구체적인 부품 : TableLink 클래스 ... 151 구체적인 부품 : TableTray 클래스 ... 152 구체적인 제품 : TablePage 클래스 ... 152 04. Abstract Factory 패턴에 등장하는 역할 ... 153 05. 독자의 사고를 넓혀주는 힌트 ... 154 06. Abstract Factory 패턴과 관련된 패턴 ... 156 07. 보강 : 인스턴스를 만드는 여러 가지 방법 ... 157 08. 이 장에서 학습한 내용 ... 158 연습문제 ... 159 Chapter 09. Bridge - 기능의 계층과 구현의 계층을 분리한다 ... 161 01. Bridge 패턴 ... 162 클래스 계층의 두 가지 역할 ... 162 02. 예제 프로그램 ... 165 기능의 클래스 계층 : Display 클래스 ... 166 기능의 클래스 계층 : CountDisplay 클래스 ... 167 구현의 클래스 계층 : DisplayImpl 클래스 ... 167 구현의 클래스 계층 : StringDisplayImpl 클래스 ... 168 Main 클래스 ... 169 03. Bridge 패턴에 등장하는 역할 ... 170 04. 독자의 사고를 넓혀주는 힌트 ... 171 05. Bridge 패턴과 관련된 패턴 ... 173 06. 이 장에서 학습한 내용 ... 173 연습문제 ... 174 Chapter 10. Strategy - 알고리즘을 모두 교체하다 ... 177 01. Strategy 패턴 ... 178 02. 예제 프로그램 ... 178 Hand 클래스 ... 179 Strategy 인터페이스 ... 181 WinningStrategy 클래스 ... 182 ProdStrategy 클래스 ... 183 Player 클래스 ... 185 Main 클래스 ... 186 03. Strategy 패턴에 등장하는 역할 ... 189 04. 독자의 사고를 넓혀주는 힌트 ... 190 05. Strategy 패턴과 관련된 패턴 ... 191 06. 이 장에서 학습한 내용 ... 191 연습문제 ... 192 Chapter 11. Composite - 그릇과 내용물의 동일시 ... 195 01. Composite 패턴 ... 196 02. 예제 프로그램 ... 197 Entry 클래스 ... 198 File 클래스 ... 199 Directory 클래스 ... 200 FileTreatmentException 클래스 ... 202 Main 클래스 ... 203 03. Composite 패턴에 등장하는 역할 ... 205 04. 독자의 사고를 넓혀주는 힌트 ... 206 복수와 단수의 동일시 ... 206 add를 어디에 두어야하나 ... 207 재귀적 구조는 여러 곳에서 등장합니다 ... 208 05. Composite 패턴과 관련된 패턴 ... 209 06. 이 장에서 학습한 내용 ... 209 연습문제 ... 210 Chapter 12. Decorator - 장식과 내용물의 동일시 ... 211 01. Decorator 패턴 ... 212 02. 예제 프로그램 ... 212 Display 클래스 ... 214 StringDisplay 클래스 ... 214 Border 클래스 ... 215 SideBorder 클래스 ... 216 FullBorder 클래스 ... 218 Main 클래스 ... 219 03. Decorator 패턴에 등장하는 역할 ... 220 04. 독자의 사고를 넓혀주는 힌트 ... 222 투과적인 인터페이스(API) ... 222 내용물을 변경하지 않고 기능을 추가할 수 있습니다 ... 222 동적인 기능 추가를 할 수 있습니다 ... 223 단순한 물품 갖추기에서도 다양한 기능을 추가할 수 있습니다 ... 223 java.io 패키지와 Decorator 패턴 ... 223 작은 클래스가 증가합니다 ... 225 05. Decorator 패턴과 관련된 패턴 ... 225 06. 보강 : 상속과 위임에 있어서의 동일시 ... 225 상속 - 하위 클래스와 상위 클래스를 동일시 ... 226 위임 - 자신과 위양할 곳을 동일시 ... 226 07. 이 장에서 학습한 내용 ... 228 연습문제 ... 228 Chapter 13. Visitor - 구조 안을 돌아다니면서 일을 한다 ... 231 01. Visitor 패턴 ... 232 02. 예제 프로그램 ... 232 Visitor 클래스 ... 233 Acceptor 인터페이스 ... 234 Entry 클래스 ... 235 File 클래스 ... 236 Directory 클래스 ... 236 ListVisitor 클래스 ... 238 FileTreatmentException 클래스 ... 239 Main 클래스 ... 239 Visitor와 Accepter의 상호 호출 ... 241 03. Visitor 패턴에 등장하는 역할 ... 243 04. 독자의 사고를 넓혀주는 힌트 ... 244 더블 디스패치 ... 244 왜 이렇게 복잡한 일을 해야하는가 ... 245 The Open-Closed Principle - 확장에 대해서는 열고, 수정에 대해서는 닫는다 ... 245 ConcreteVisitor 역할의 추가는 간단합니다 ... 246 ConcreteAcceptor 역할의 추가는 곤란합니다 ... 246 Visitor가 처리를 하기 위해서는 무엇이 필요한가 ... 247 05. Visitor 패턴과 관련된 패턴 ... 247 06. 이 장에서 학습한 내용 ... 248 연습문제 ... 248 Chapter 14. Chain of Responsibility - 책임 떠넘기기 ... 253 01. Chain of Responsibility 패턴 ... 254 02. 예제 프로그램 ... 255 Trouble 클래스 ... 256 Support 클래스 ... 256 NoSupport 클래스 ... 257 LimitSupport 클래스 ... 258 OddSupport 클래스 ... 259 SpecialSupport 클래스 ... 259 Main 클래스 ... 260 03. Chain of Responsibility 패턴에 등장하는 역할 ... 262 04. 독자의 사고를 넓혀주는 힌트 ... 263 요구를 하는 사람과 요구를 처리하는 사람을 느슨하게 연결합니다 ... 263 동적으로 연쇄의 형태를 바꿉니다 ... 263 자신의 일에 집중할 수 있습니다 ... 264 떠넘기기로 처리가 늦어지지 않을까? ... 264 05. Chain of Responsibility 패턴과 관련된 패턴 ... 264 06. 이 장에서 학습한 내용 ... 265 연습문제 ... 265 Chapter 15. Facade - 간단한 창구 ... 267 01. Facade 패턴 ... 268 02. 예제 프로그램 ... 268 Database 클래스 ... 270 HtmlWriter 클래스 ... 271 PageMaker 클래스 ... 273 Main 클래스 ... 274 03. Facade 패턴에 등장하는 역할 ... 275 04. 독자의 사고를 넓혀주는 힌트 ... 276 Facade 역할이 하는 일은 무엇일까 ... 276 재귀적인 Facade 패턴의 적용 ... 277 프로그래머가 Facade를 만들지 않는 이유 - 심리적 요인 ... 277 05. Facade 패턴과 관련된 패턴 ... 277 06. 이 장에서 학습한 내용 ... 278 연습문제 ... 278 Chapter 16. Mediator - 상대는 하나뿐 ... 281 01. Mediator 패턴 ... 282 02. 예제 프로그램 ... 283 Mediator 인터페이스 ... 286 Colleague 인터페이스 ... 287 ColleagueButton 클래스 ... 288 ColleagueTextField 클래스 ... 289 ColleagueCheckbox 클래스 ... 290 LoginFrame 클래스 ... 291 Main 클래스 ... 294 03. Mediator 패턴에 등장하는 역할 ... 295 04. 독자의 사고를 넓혀주는 힌트 ... 296 분산이 재앙이 되는 경우 ... 296 통신 경로의 증가 ... 296 재사용할 수 있는 것은 무엇인가 ... 297 05. Mediator 패턴과 관련된 패턴 ... 297 06. 이 장에서 학습한 내용 ... 298 연습문제 ... 298 Chapter 17. Observer - 상태의 변화를 통지한다 ... 299 01. Observer 패턴 ... 300 02. 예제 프로그램 ... 300 Observer 인터페이스 ... 301 NumberGenerator 클래스 ... 301 RandomNumberGenerator 클래스 ... 302 DigitObserver 클래스 ... 303 GraphObserver 클래스 ... 304 Main 클래스 ... 304 03. Observer 패턴에 등장하는 역할 ... 305 04. 독자의 사고를 넓혀주는 힌트 ... 307 여기서도 교환 가능성이 등장합니다 ... 307 Observer의 순서 ... 307 Observer의 행위가 Subject에 영향을 줄 때 ... 308 갱신을 위한 정보의 취급 ... 309 '관찰'하는 것이 아니라 '통지'를 받고 있습니다 ... 310 Model/View/Controller(MVC) ... 310 05. 보강 : java.util.Observer 인터페이스 ... 310 06. Observer 패턴과 관련된 패턴 ... 311 07. 이 장에서 학습한 내용 ... 312 연습문제 ... 312 Chapter 18. Memento - 상태를 보존한다 ... 315 01. Memento 패턴 ... 316 02. 예제 프로그램 ... 317 Memento 클래스 ... 317 Gamer 클래스 ... 319 Main 클래스 ... 321 03. Memento 패턴에 등장하는 역할 ... 324 04. 독자의 사고를 넓혀주는 힌트 ... 326 두 개의 인터페이스(API)와 액세스 제어 ... 326 Memento를 몇 개 가질까? ... 327 Memento의 유효기간은? ... 327 Caretaker 역할과 Originator 역할을 분리하는 의미 ... 328 05. Memento 패턴과 관련된 패턴 ... 328 06. 이 장에서 학습한 내용 ... 329 연습문제 ... 329 Chapter 19. State - 상태를 클래스로 표현한다 ... 331 01. State 패턴 ... 332 02. 예제 프로그램 ... 332 금고경비 시스템 ... 332 State 패턴을 사용하지 않는 유사 코딩 ... 334 State 패턴을 사용한 유사 코딩 ... 335 State 인터페이스 ... 336 DayState 클래스 ... 338 NightState 클래스 ... 339 Context 인터페이스 ... 340 SafeFrame 클래스 ... 340 Main 클래스 ... 345 03. State 패턴에 등장하는 역할 ... 346 04. 독자의 사고를 넓혀주는 힌트 ... 347 분할해서 통치해라 ... 347 상태에 의존한 처리 ... 348 상태변화는 누가 관리해야하나 ... 349 자기모순이 발생하지 않습니다 ... 350 새로운 상태를 추가하는 것은 간단 ... 350 다수의 얼굴을 가진 인스턴스 ... 350 05. State 패턴과 관련된 패턴 ... 351 06. 이 장에서 배운 것 ... 352 연습문제 ... 352 Chapter 20. Flyweight - 동일한 것을 공유해서 낭비를 없앤다 ... 355 01. Flyweight 패턴 ... 356 02. 예제 프로그램 ... 357 BigChar 클래스 ... 360 BigCharFactory 클래스 ... 361 BigString 클래스 ... 363 Main 클래스 ... 364 03. Flyweight 패턴에 등장하는 역할 ... 365 04. 독자의 사고를 넓혀주는 힌트 ... 366 여러 곳에 영향이 미칩니다 ... 366 intrinsic과 extrinsic ... 367 관리되고 있는 인스턴스는 쓰레기수집(garbage collection)이 되지 않습니다 ... 368 메모리 이외의 리소스 ... 369 05. Flyweight 패턴과 관련된 패턴 ... 369 06. 이 장에서 학습한 내용 ... 370 연습문제 ... 371 Chapter 21. Proxy - 필요해지면 만든다 ... 373 01. Proxy 패턴 ... 374 02. 예제 프로그램 ... 374 Printer 클래스 ... 376 Printable 인터페이스 ... 377 PrinterProxy 클래스 ... 378 Main 클래스 ... 380 03. Proxy 패턴에 등장하는 역할 ... 381 04. 독자의 사고를 넓혀주는 힌트 ... 382 대리인을 사용해서 스피드업 ... 382 대리인과 본인을 분리할 필요가 있는가 ... 383 대리와 위임 ... 383 투과적이라는 것 ... 383 HTTP Proxy ... 384 다양한 Proxy ... 384 05. Proxy 패턴과 관련된 패턴 ... 385 06. 이 장에서 배운 것 ... 385 연습문제 ... 386 Chapter 22. Command - 명령을 클래스로 만든다 ... 387 01. Command 패턴 ... 388 02. 예제 프로그램 ... 388 Command 인터페이스 ... 390 MacroCommand 클래스 ... 391 DrawCommand 클래스 ... 392 Drawable 인터페이스 ... 393 DrawCanvas 클래스 ... 394 Main 클래스 ... 395 03. Command 패턴에 등장하는 역할 ... 399 04. 독자의 사고를 넓혀주는 힌트 ... 401 명령이 지니고 있어야하는 정보는? ... 401 이력의 보존 ... 402 어댑터 ... 402 05. Command 패턴과 관련된 패턴 ... 405 06. 이 장에서 학습한 내용 ... 405 연습문제 ... 406 Chapter 23. Interpreter - 문법 규칙을 클래스로 표현한다 ... 407 01. Interpreter 패턴 ... 408 02. 미니 언어 ... 409 미니 언어의 명령 ... 409 미니 프로그램의 예 ... 410 미니 언어의 문법 ... 414 터미널 익스프레션과 논터미널 익스프레션 ... 415 03. 예제 프로그램 ... 416 Node 클래스 ... 417 ProgramNode 클래스 ... 418 CommandListNode 클래스 ... 420 CommandNode 클래스 ... 421 RepeatCommandNode 클래스 ... 422 PrimitiveCommandNode 클래스 ... 423 Context 클래스 ... 424 ParseException 클래스 ... 426 Main 클래스 ... 426 04. Interpreter 패턴에 등장하는 역할 ... 428 05. 독자의 사고를 넓혀주는 힌트 ... 429 그밖에 어떤 미니 언어가 있을까 ... 429 건너뛰고 읽을까, 그냥 읽을까 ... 430 06. Interpreter 패턴과 관련된 패턴 ... 430 07. 이 장에서 학습한 내용, 그리고 마지막으로 한마디 ... 431 연습문제 ... 432 Appendix ... 433 부록 A. 연습문제 해답 ... 434 부록 B. 예제 프로그램의 실행순서 ... 522 부록 C. GoF에 의한 디자인 패턴의 분류 ... 525 부록 D. 참고문헌 ... 526 찾아보기 ... 529