Changes

Jump to: navigation, search

Decorator

4,469 bytes added, 14:33, 11 April 2007
m
Example
[[BTP600]] > [[Decorator]]
Allow new/additional responsibility to be added to an existing object dynamically. Decoratores provide a flexible alternative to subclassing for extending functionality.
}
[[Image:wrappingdecoratorwrappingdecorator2.png|300 px|thumb|Figure 1 wrapping Decorator classes]]
Leaf classes that inherit from Beverage class
==Example==
[[Image:javaIOdecoratorjavaIOdecorator2.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 Source under the [http://www.java.net/jrl.csp JRL license] [http://www.java.net/download/jdk6/6u1/promoted/b03/jdk-6u1-ea-src-b03-jrl-19_jan_2007.jar jdk-6u1-ea-src-b03-Source] under the [http://www.java.net/jrl-19_jan_2007.jarcsp 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: /** * Table cell renderer that decorates a delegate cell renderer. It implements * the Decorator design pattern. */ public abstract class InputStream TDecoratorTableCellRenderer implements Closeable 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: publicclass DefaultTableCellRenderer extends JLabel implements TableCellRenderer, Serializable { /** * Creates a default table cell renderer. */ public DefaultTableCellRenderer() { super(); setOpaque(true); setBorder(getNoFocusBorder()); } } TDateTableCellRenderer: public class FilterInputStream TDateTableCellRenderer extends InputStream {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: /// publicTable cell renderer for \a TPopulation objects. public class FileInputStream TPopulationTableCellRenderer extends InputStreamDefaultTableCellRenderer
{
/// 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 O R 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