Computer Science 209 Introduction to Design Patterns: Iterator Composite Decorator.
-
Upload
julian-carroll -
Category
Documents
-
view
212 -
download
0
Transcript of Computer Science 209 Introduction to Design Patterns: Iterator Composite Decorator.
Computer Science 209
Introduction to Design Patterns:
Iterator
Composite
Decorator
Patterns and Design Problems
• A design pattern gives advice about solving a problem in software design
• Different problems often have features in common
• A design pattern captures a common way of solving problems in a set of rules
Example: Visiting a Set of Items in Sequence
StringTokenizer tokens = new StringTokenizer("The cat is on the mat");while (tokens.hasMoreTokens()) System.out.println(tokens.nextToken());
Iterator<String> iter = aSet.iterator();while (iter.hasNext()) System.out.println(iter.next ());
Scanner reader = new Scanner(blah blah blah);while (reader.hasNext()){ String data = reader.nextLine(); System.out.println(data);}
The Iterator Pattern
• The iterator pattern captures the common elements of this set of problems and gives advice, in the form of a set of rules, for solving them
• Each pattern has – a short name – a brief description of the context– a lengthy description of the problem– a prescription for a solution
Proven advice in a standard format
The Iterator Pattern: Context
• An aggregate contains elements
• Clients need to access the elements
• The aggregate should not expose its internal structure
• There may be multiple clients that need simultaneous access
The Iterator Pattern: Solution
• Define an iterator class that fetches one element at a time
• Each iterator object tracks the position of the next element
• Because there might be multiple aggregate and iterator classes, it is best to have a single iterator interface
The Context of the Composite Pattern
• I want to combine primitive objects into compound objects
• I want clients to treat these compounds as primitives
Solution of the Composite Pattern
• Define an interface as an abstraction for the primitive objects
• A composite object contains a collection of the primitives
• Both primitives and composites implement the interface
• Composite applies method to primitives and combines results
The Composite Pattern
Composite
<<interface>>Primitive
Leaf
method()
method()
*
The composite calls method() for each leaf and combines the results.
Example: GUI Components
• Some components, like buttons and fields, are primitives
• Other components, like frames and panels, are containers (composites)
• A container computes its preferred size by combining all the preferred sizes of its components
The Context of the Decorator Pattern
• I want to enhance the behavior of a class, called the component class
• A decorated component can be used in the same way as a plain component
• The component does not want the responsibility of the decoration
• There may be any number of decorations
Solution of the Decorator Pattern
• Define an interface as an abstraction for the component
• Component classes and decorator classes implement this interface
• A decorator object manages the component object that it decorates
• The decorator applies a method to a component and combines the result with the effect of the decoration
The Decorator Pattern
Decorator
<<interface>>Component
ConcreteComponent
method()
method()
1
The decorator calls method() for the component and augments the results.
Example: Scroll Panes
• A scroll pane can decorate several components, such as text areas and list boxes
• The scroll pane’s paint method paints both the decorated component and the scroll bars
Using JScrollPane
JTextArea outputArea = new JTextArea();
JScrollPane outputPane = new JScrollPane(outputArea);
container.add(outputPane);
// Reference outputArea later in the program
Example: File Streams
• java.io includes many classes for manipulating different kinds of I/O streams
• Start with a basic input or output stream and decorate it until you get the type of stream you want
Using Input StreamsFileInputStream stream = new FileInputStream("anyfile.txt");
InputStreamReader iStrReader = new InputStreamReader(stream); // Now read characters from iStrReader or
BufferedReader reader = new BufferedReader(iStrReader);
// Now read lines of text from reader or
StreamTokenizer nizer = new StreamTokenizer(reader);
// Now read tokens (words) from nizer
Each decoration adds a new layer of functionality
Example: A ScannerScanner reader = new Scanner(new File("anyfile.txt")); // Now read data from the file
The same pattern is applied in similar situations
Scanner reader = new Scanner(System.in); // Now read data from the keyboard
Scanner reader = new Scanner("any file many other words text"); // Now read data from the string
Where Do Patterns Come From?
• Software best practices
• Catalogued and discussed in the Gang of Four book, Design Patterns
• Web sites abound
How Do I Spot the Need for One?
• Remember a place where a pattern is put to use and see the similarity of the current situation to that place
• Look at the intent of a pattern to see whether it applies in the current situation
• Review the context and solution parts of each potential pattern in detail