Design Patterns Explained Java Code Examples – Chapter 17: The Decorator Pattern

Chapter 17: The Decorator Pattern
Code Examples

Example 17-1: Decorator

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.