Chapter 17: The Decorator Pattern
Code Examples
TOC
How it works: Decorators wrap their trailing object
Example 17-1: Decorator
TOP
public class Client {
public static void main(String[] args) {
Factory myFactory;
myFactory = new Factory();
Component myComponent = myFactory.getComponent();
}
}
abstract public class Component {
abstract public void prtTicket();
}
public class SalesTicket extends Component {
public void prtTicket() {
// place sales ticket printing code here
}
}
abstract public class TicketDecorator extends Component {
private Component myTrailer;
public TicketDecorator (Component myComponent) {
myTrailer= myComponent;
}
public void callTrailer () {
if (myTrailer != null) myTrailer.prtTicket();
}
}
public class Header1 extends TicketDecorator {
public Header1 (Component myComponent) {
super(myComponent);
}
public void prtTicket () {
// place printing header 1 code here
super.callTrailer();
}
}
public class Header2 extends TicketDecorator {
public Header2 (Component myComponent) {
super(myComponent);
}
public void prtTicket () {
// place printing header 2 code here
super.callTrailer();
}
}
public class Footer1 extends TicketDecorator {
public Footer1 (Component myComponent) {
super(myComponent);
}
public void prtTicket() {
super.callTrailer();
// place printing footer 1 code here
}
}
public class Footer2 extends TicketDecorator {
public Footer2 (Component myComponent) {
super(myComponent);
}
public void prtTicket() {
super.callTrailer();
// place printing footer 2 code here
}
}
public class Factory {
public Component getComponent () {
Component myComponent;
myComponent= new SalesTicket();
myComponent= new Footer1(myComponent);
myComponent= new Header1(myComponent);
return myComponent;
}
}
What happens in the code
If I want the sales ticket to look like:
HEADER 1
SALES TICKET
FOOTER 1
Then myFactory.getComponent returns
return(new Header1(new Footer1 ( new SalesTicket())));
This creates a Header1 object trailed by a Footer1 object trailed by a SalesTicket object.
If I want the sales ticket to look like:
HEADER 1
HEADER 2
SALES TICKET
FOOTER 1
Then myFactory.getComponent returns
return(new Header1(new Header2 (new Footer1( new SalesTicket()))));
This creates a Header1 object trailed by a Header2 object trailed by a Footer1 object trailed by a SalesTicket object.