Foreword
Preface
1 INTRODUCTION TO PATTERNS
Why Patterns?
Why Design Patterns?
Why Java?
Why UML?
Why a Workbook?
The Organization of This Book
Welcome to Oozinoz!
Source Code Disclaimer
Summary
PART I INTERFACE PATTERNS
2 INTRODUCING INTERFACES
Ordinary Interfaces
Interfaces and Obligations
Placing Constants in Interfaces
Summary
Beyond Ordinary Interfaces
3 ADAPTER 21
Adapting in the Presence of Foresight
Class and Object Adapters
Unforeseen Adaptation
Recognizing ADAPTER
Summary
4 FACADE 37
Refactoring to FACADE
Facades, Utilities, and Demos
Summary
5 COMPOSITE 51
An Ordinary Composite
Recursive Behavior in Composites
Trees in Graph Theory
Composites with Cycles
Consequences of Cycles
Summary
6 BRIDGE 65
A Classic Example of BRIDGE: Drivers
Refactoring to BRIDGE
A Bridge Using the List Interface
Summary
PART II RESPONSIBILITY PATTERNS
7 INTRODUCING RESPONSIBILITY
Ordinary Responsibility
Controlling Responsibility with Visibility
Summary
Beyond Ordinary Responsibility
8 SINGLETON
SINGLETON Mechanics
Singletons and Threads
Recognizing SINGLETON
Summary
9 OBSERVER
A Classic Example: OBSERVER in Swing
Model/View/Controller
Maintaining an Observable Object
Summary
10 MEDIATOR 103
A Classic Example: GUI Mediators
Relational Integrity Mediators
Summary
11 PROXY 115
A Classic Example: Image Proxies
Image Proxies Reconsidered
Remote Proxies
Summary
12 CHAIN OF RESPONSIBILITY 131
Varieties of Lookup
Refactoring to CHAIN OF RESPONSIBILITY
Anchoring a Chain
CHAIN OF RESPONSIBILITY without COMPOSITE
Summary
13 FLYWEIGHT 139
Recognizing FLYWEIGHT
Immutability
Extracting the Immutable Part of a Flyweight
Sharing Flyweights
Summary
PART III CONSTRUCTION PATTERNS
14 INTRODUCING CONSTRUCTION 151
Ordinary Construction
Superclass Collaboration
Collaboration within a Class
Summary
Beyond Ordinary Construction
15 BUILDER 157
Building from a Parser
Building under Constraints
Building a Counteroffer
Summary
16 FACTORY METHOD 165
Recognizing FACTORY METHOD
A Classic Example of FACTORY METHOD: Iterators
Taking Control of Which Class to Instantiate
FACTORY METHOD in Parallel Hierarchies
Summary
17 ABSTRACT FACTORY 175
Abstract Factories for Families of Objects
Packages and Abstract Factories
Abstract Factories for Look-and-Feel
Summary
18 PROTOTYPE 183
Prototypes as Factories
Prototyping with Clones
Using Object. clone()
Summary
19 MEMENTO 193
Memento Durability
Applying Memento
Persisting Mementos across Sessions
Using Strings as Mementos
Summary
PART IV OPERATION PATTERNS
20 INTRODUCING OPERATIONS 205
Operations, Methods, and Algorithms
The Mechanics of Methods
Exceptions in Methods
Summary
Beyond Ordinary Operators
21 TEMPLATE METHOD 215
A Classic Example of TEMPLATE METHOD: Sorting
Completing an Algorithm
TEMPLATE METHOD Hooks
Refactoring to TEMPLATE METHOD
Summary
22 STATE 225
Modeling States
Refactoring to STATE
Making States Constant
Summary
23 STRATEGY 237
Modeling Strategies
Refactoring to STRATEGY
Comparing STRATEGY and STATE
Comparing STRATEGY and TEMPLATE METHOD
Summary
24 COMMAND 249
A Classic Example: Menu Commands
Using COMMAND tO Supply a Service
COMMAND in Relation to Other Patterns
Summary
25 INTERPRETER 259
An INTERPRETER Example
Interpreters, Languages, and Parsers
Summary
PART V EXTENSION PATTERNS
26 INTRODUCING EXTENSIONS 273
Reuse as an Alternative to Extension
Extending by Subclassing
The Liskov Substitution Principle
Extending by Delegating
Summary
Beyond Ordinary Extension
27 DECORATOR 289
A Classic Example of DECORATOR: Streams
Function Decorators
Decorating without DECORATOR
Summary
28 ITERATOR 313
Type-Safe Collections
Iterating Over a Composite
Thread-Safe Iterators
Summary
29 VISITOR 337
Supporting VISITOR
Extending with VISITOR
VISITOR Cycles
VISITOR Controversy
Summary
PART VI APPENDIXES
A APPENDIX A: DIRECTIONS 355
B APPENDIX B: SOLUTIONS 359
C APPENDIX C: UML AT A GLANCE 441
Glossary 449
Bibliography 459