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.