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