====== Design Patterns ====== ===== Contents ===== - Introduction - What is a Design Pattern? //"Each pattern describes a problem which occurs over and over again in our environment, and then describes the core of the solution to that problem, in such a way that you can use this solution a million times over, without ever doing it the same way twice."// In general, a pattrn has four essential elements - The **pattern** name - The **problem** describes when to apply the pattern - The **solution** describes the elements that make up the design, their relationships, responsibilities, and collaborations. - The **consequences** are the results and trade-offs of applying the pattern. - Design Patterns in Smalltalk MVC. The Model/View/Controller (MVC) triad of classes is used to build user interfaces in Smalltalk-80... - Describing Design Patterns. We describe design patterns using a consistent form. Each pattern is divided into sections according to the following template. The template lends a uniform structure to the information, making design patterns easier to learn, compare, and use. {{page>design_pattern_template}} - The Catalog of Design Patterns - Orgnaizing the Catalog - How Design Patterns Solve Design Problems - How to Select a Design Pattern - How to Use a Design Pattern - A Case Study: Designing a Document Editor - Design Problems - Document Structure - Formatting - Embellishing the User Interface - Supporting Multiple Look-and-Feel Standards - User Operations - Spelling Checking and Hyphenation - Summary - Creational Patterns - Abstract Factory. \\ > Provide an interface for creating families of related or dependent objects without specifying their concrete classes. - Builder \\ > Separate the construction of a complex object from its representation so that the same construction process can create different representations. - Factory Method \\ > Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses. - Prototype \\ > Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype. - Singleton \\ > Ensure a class only has one instance, and provide a global point of access to it. - Discussion of Creational Patterns - Structural Patterns - Adapter \\ > Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn't otherwise because of incompatible interfaces. - Bridge \\ > Decouple an abstraction from its implementation so that the two can vary independently. - Composite \\ > Compose objects into tree structures to represent part-whole hierarchies. Composite lest clients treat individual objects and compositions of objects uniformly. - Decorator \\ > Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality. - Facade \\ > Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsytem easier to use. - Flyweight \\ > Use sharing to support large numbers of fine-grained objects efficiently. - Proxy \\ > Provide a surrogate or placeholder for another object to control access to it. - Behavioral Patterns - Chain of Responsibility \\ > Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it. - Command \\ > Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations. - Interpreter \\ > Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the language. - [[dp_iterator|Iterator]] \\ > Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation. - Mediator \\ > Define an object that encapsulated how a set of object interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently. - Memento \\ > Without violating encapsulation, capture and externalize an object's internal state so that the object can be restored to this state later. - [[dp_observer|Observer]] \\ > Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. - State \\ > Allow an object to alter its behavior when its internal state changes. The object will appear to change its class. - [[dp_strategy|Strategy]] \\ > Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it. - Template Method \\ > Define the skeleton of an algorithm in an operation, deferring some steps to the subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the slgorithm's structure. - [[dp_visitor|Visitor]] \\ > Represent an operation to be performed on the elements of an object structure. Visitor lest you define a new operation without changing the classes of the elements on which it operates. - Discussion of Behavioral Patterns - Conclusion - What to Expect from Design Patterns - A Brief History - The Pattern Community - An Invitation - A Parting Thought - Glossary - Guide to Notation - Foundation Classes - Bibliography