Decorator Design Pattern - PowerPoint PPT Presentation

1 / 18
About This Presentation
Title:

Decorator Design Pattern

Description:

Attach additional responsibilities to an object dynamically. ... Vert. draw() resize() Java Borders. Every JComponent can have one or more borders. ... – PowerPoint PPT presentation

Number of Views:736
Avg rating:3.0/5.0
Slides: 19
Provided by: rickm1
Category:

less

Transcript and Presenter's Notes

Title: Decorator Design Pattern


1
Decorator Design Pattern
Rick MercerCSC 335 Object-Oriented Programming
and Design
2
The Decorator Pattern from GoF
  • Intent
  • Attach additional responsibilities to an object
    dynamically. Decorators provide a flexible
    alternative to subclassing to extend flexibility
  • Also Known As Wrapper
  • Motivation
  • Want to add properties to an existing object.
    Examples
  • Add borders or scrollbars to a GUI component
  • Add headers and footers to an advertisement
  • Add stream functionality such as reading a line
    of input or compressing a file before sending it
    over the wire

3
Applicability
  • Use Decorator
  • To add responsibilities to individual objects
    dynamically without affecting other objects
  • When extending classes is impractical
  • Sometimes a large number of independent
    extensions are possible and would produce an
    explosion of subclasses to support every
    combination
  • this inheritance approach is shown next

4
An Application
  • Suppose there is a TextView GUI component and you
    want to add different kinds of borders and/or
    scrollbars to it
  • Currently, there are three types of borders
  • Plain, 3D, Fancy
  • And two scrollbars
  • Horizontal and Vertical
  • An inheritance solution requires15 classes for
    one view

5
Thats a lot of classes!
  • TextView-Plain
  • TextView-Fancy
  • TextView-3D
  • TextView-Horizontal
  • TextView-Vertical
  • TextView-Horizontal-Vertical
  • TextView-Plain-Horizontal
  • TextView-Plain-Vertical
  • TextView-Plain-Horizontal-Vertical
  • TextView-3D-Horizontal
  • TextView-3D-Vertical
  • TextView-3D-Horizontal-Vertical
  • TextView-Fancy-Horizontal
  • TextView-Fancy-Vertical
  • TextView-Fancy-Horizontal-Vertical

6
Disadvantages
  • Inheritance solution has an explosion of classes
  • If another type of border were added, how many
    more classes do we need?
  • If another view were added such as
    StreamedVideoView, how many more classes are
    needed?
  • Would have to instantiate specific classes at
    compiletime
  • would be better to be able to change borders at
    runtime
  • This is inflexible, cant change view or border
    at runtime
  • Use the Decorator Pattern instead (Java does)

7
VisualComponent draw() resize()
1
SteamedVideoView draw() resize()
TextView draw() resize()
Decorator draw() resize()
1
Decorator contains a visual component
Border draw() resize()
ScrollBar draw() resize()
Fancy draw() resize()
Vert draw() resize()
Plain draw() resize()
3D draw() resize()
Horiz draw() resize()
8
Java Borders
  • Every JComponent can have one or more borders.
    Borders are incredibly useful objects that, while
    not themselves components, know how to draw the
    edges of Swing components. Borders are useful not
    only for drawing lines and fancy edges, but also
    for providing titles and empty space around
    components.
  • The Java Tutorial http//java.sun.com/docs/books/t
    utorial/uiswing/components/border.html

9
Add a Beveled Border
toStringView.setBorder(new BevelBorder(
BevelBorder.LOWERED, Color.BLUE, Color.RED))
10
Decorate Again
  • JScrollPane scrollPane
  • new JScrollPane(toStringView)
  • add(scrollPane, BorderLayout.CENTER)

11
Motivation Continued
  • The more more flexible containment approach
    encloses the component in another object that
    adds the border
  • The enclosing object is called the decorator
  • The decorator conforms to the interface of the
    component so its presence is transparent to
    clients
  • The decorator forwards requests to the component
    and may perform additional actions before or
    after any forwarding

12
Decorator Pattern in Java
  • InputStreamReader
  • ... bridge from byte streams to character
    streams It reads bytes and translates them into
    characters using the specified character
    encoding. JavaTMAPI
  • BufferedReader
  • Read text from a character-input stream,
    buffering characters so as to provide for the
    efficient reading of characters, arrays, and
    lines. JavaTMAPI
  • What programmer's had to do through Java 1.4
    before Scanner
  • BufferedReader keyboard
  • new BufferedReader(new
  • InputStreamReader(System.in))

13
Example of decorator pattern use
BufferedReader decorates InputStreamReader
BufferedReader readLine() ready()
InputStreamReader read() close()
14
Java streams
  • With gt 60 streams in Java, you can create a wide
    variety of input and output streams
  • this provides flexibility good
  • it also adds complexity bad
  • Flexibility made possible with inheritance and
    classes that accept classes that extend the
    parameter type
  • You can have an InputStream instance or any
    instance of a class that extends InputStream
  • public InputStreamReader(InputStream in)

15
One Constructor for many subclasses
  • InputStream has these direct known subclasses
  • ByteArrayInputStream, FileInputStream,
    FilterInputStream, InputStream,
    ObjectInputStream, PipedInputStream,
  • SequenceInputStream, StringBufferInputStream
  • System.in is an instance of InputStream
  • We decorated a FileInputStream with an
    ObjectInputStream so you can read objects that
    implement Serializable

16
Code Demo
  • Read a plain text file and compress it using the
    GZIP format GZIP.java
  • Read a compress file in the GZIP format and write
    it to a plain text file UNGZIP.java
  • Sample text iliad10.txt from Project Gutenberg
  • Add this code to see in plain text in console
  • for (int i 0 i lt len i)
  • System.out.print((char) bufi)
  • System.out.println()

17
  • // Open the input file
  • String inFilename "iliad10.txt"
  • FileInputStream input newFileInputStream(inFilen
    ame)
  • // Open the output file
  • String outFilename "iliad10.gz"
  • GZIPOutputStream out new GZIPOutputStream(
  • new FileOutputStream(out
    Filename))
  • // Transfer bytes from the output file to the
    compressed file
  • byte buf new byte1024
  • int len
  • while ((len input.read(buf)) gt 0)
  • out.write(buf, 0, len)
  • // Close the file and stream
  • input.close()
  • out.close()

18
  • // Open the gzip file
  • String inFilename "iliad10.gz"
  • GZIPInputStream gzipInputStream new
    GZIPInputStream(new FileInputStream(inFilename))
  • // Open the output file
  • String outFilename "TheIliadByHomer"
  • OutputStream out new FileOutputStream(outFilenam
    e)
  • // Transfer bytes from the compressed file to the
    output file
  • byte buf new byte1024
  • int len
  • while ((len gzipInputStream.read(buf)) gt 0)
  • out.write(buf, 0, len)
  • for (int i 0 i lt len i)
  • System.out.print((char) bufi)
  • System.out.println()
  • // Close the file and stream
  • gzipInputStream.close()
  • out.close()
Write a Comment
User Comments (0)
About PowerShow.com