Changes

Jump to: navigation, search

Decorator

5,266 bytes added, 14:33, 11 April 2007
m
Example
==Motivation==
As an example we can look at graphical user interface toolkits a coffee shop ordering service where we want to add responsibility such as scrolling behaviour or border property to individual objects, not to an entire classbeverages can be decorated with different kinds of condiments. By using inheritance to add responsibility to a user interface component is inflexible because it is made staticallythe Decorator pattern one can get their beverage just right and the cost can be easily calculated for every added condiment. A better approach Adding new beverages/condiments is wrapping easy too, just by creating the new class and changing the decorator component in another object dynamicallymenu.
==Sample Code==
[[Image:beveragedecorator.png|300 px|thumb|Beverage Decorator UML diagram]]
Beverage is the abstract component class
public abstract class Beverage {
//static abstract double size();
}
 
[[Image:wrappingdecorator2.png|300 px|thumb|Figure 1 wrapping Decorator classes]]
Leaf classes that inherit from Beverage class
}
}
 
[[Image:beverageDecoratorWholePic.png|300 px|thumb|The Big Picture]]
Condiment Decorator class
}
}
<!--{| align="left"
|-
[[Image:beveragedecorator.png| 300 px|Beverage Decorator UML diagram]]
[[Image:wrappingdecorator.png|300 px|Figure 1 wrapping Decorator classes]]
[[Image:beveragedecorator.png|300 px|Beverage Decorator UML diagram]]
[[Image:beverageDecoratorWholePic.png|300 px|Whole Picture]]
|}
-->
==Example==
[[Image:javaIOdecorator2.png|500 px|thumb|Java I/O classes]] Java I/O [http://java.sun.com/javase/6/docs/api/java/io/package-frame.html API] JDK 6u1 [http://www.java.net/download/jdk6/6u1/promoted/b03/jdk-6u1-ea-src-b03-jrl-19_jan_2007.jar Source] under the [http://www.java.net/jrl.csp JRL license] extract: java -jar jdk-6u1-ea-src-b03-jrl-19_jan_2007.jar java.io location: j2se/src/share/classes/java/io/ ----Abstract Component class: public abstract class InputStream { abstract int read(); }Concrete Component class: class FileInputStream extends InputStream { public int read(); }Decorator class: public class FilterInputStream extends InputStream { { //<span style="color:red">Local variable for storing the reference of the concrete component class</span> protected volatile InputStream in; protected FilterInputStream(InputStream in) { this.in = in; } public int read() { return in.read(); } }Concrete Decorator class: public class PushbackInputStream extends FilterInputStream { public PushbackInputStream(InputStream in, int size) { super(in); //<span style="color:red">Calls the FilterInputStream class and stores the reference of InputStream</span> if (size <= 0) { throw new IllegalArgumentException("size <= 0"); } this.buf = new byte[size]; this.pos = size; } public int read(){ ensureOpen(); if (pos < buf.length) { return buf[pos++] & 0xff; } return super.read(); } } ---- [[Image:mpclDecorator.png|400 px|thumb|MPCL]] Multi purpose class library (MPCL) [http://www.google.com/codesearch?hl=en&q=show:QUdC7Hs10WU:9dcfaUrTzRs:gcPYjQUkI_I&sa=N&ct=rd&cs_p=http://www.uesqlc.org/download/mpcl/mpcl-11.0.2.zip&cs_f=mpcl-11.0.2/src/java/lib/org/mpcl/nui/table/TDecoratorTableCellRenderer.java Source Code] GPL license ---- Concrete Components <br>TDecoratorTableCellRenderer: /**Decorating our Beverages *Java I Table cell renderer that decorates a delegate cell renderer. It implements * the Decorator design pattern. */ public class TDecoratorTableCellRenderer implements TableCellRenderer { /// Delegate table cell renderer. private TableCellRenderer tDelegateTableCellRenderer; /// Table cell decorator. private ITableCellDecorator tTableCellDecorator; // // C O N S T R U C T O R S // /** * Builds a new instance. * @param tDELEGATE_TABLE_CELL_RENDERER The delegate table cell renderer. * @param tTABLE_CELL_DECORATOR Table cell decorator. */ public TDecoratorTableCellRenderer ( TableCellRenderer tDELEGATE_TABLE_CELL_RENDERER , ITableCellDecorator tTABLE_CELL_DECORATOR ) { tDelegateTableCellRenderer = tDELEGATE_TABLE_CELL_RENDERER; tTableCellDecorator = tTABLE_CELL_DECORATOR; }  DefaultTableCellRenderer: public class DefaultTableCellRenderer extends JLabel implements TableCellRenderer, Serializable { /** * Creates a default table cell renderer. */ public DefaultTableCellRenderer() { super(); setOpaque(true); setBorder(getNoFocusBorder()); } } TDateTableCellRenderer: public class TDateTableCellRenderer extends DefaultTableCellRenderer { /// Date format. private DateFormat tDateFormat; // // C O N S T R U C T O R S // /** * Sets the String object for the cell being rendered to value. * @param tVALUE The value for this cell; if \a tVALUE is \a null it sets the * the text value to an empty string. * @see javax.swing.table.DefaultTableCellRenderer#setValue() */ protected void setValue (Object tVALUE) { setText (( tVALUE == null ) ? "" : tDateFormat.format ((Date) tVALUE)); } TPopulationTableCellRenderer: /// Table cell renderer for \a TPopulation objects. public class TPopulationTableCellRenderer extends DefaultTableCellRenderer { /// Number format. public NumberFormat tNumberFormat; // // C O N S T R U C T O R S // /** * Sets the String object for the cell being rendered to value. * @param tVALUE The value for this cell; if \a tVALUE is \a null it sets the * the text value to an empty string. * @see javax.swing.table.DefaultTableCellRenderer#setValue() */ protected void setValue (Object tVALUE) { if ( tNumberFormat == null) { tNumberFormat = TDecimalFormat._getPopulationInstance(); } setText (( tVALUE == null ) ? "" : tNumberFormat.format (((TPopulation) tVALUE).intValue())); } // // C O N S T R U C T OR S // /// Builds a new instance. public TPopulationTableCellRenderer() { super(); setHorizontalAlignment (DefaultTableCellRenderer.RIGHT); } } // class TPopulationTableCellRenderer ==Contributions==[http://zenit.senecac.on.ca/wiki/index.php/Talk:Adapter Adapter pattern] in Eclipse
==References==
Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley. ISBN 0-201-63361-2.
 
Freeman, Eric; Freeman, Elisabeth; Sierra, Kathy; Bates, Bert (2004). Head First Design Patterns. O`Reilly. ISBN 0-596-00712-4.
 
http://www.dofactory.com/Patterns/PatternDecorator.aspx
1
edit

Navigation menu