// Interface for the main product - ConcertTicket interface ConcertTicket { String getDescription(); double getCost(); } // A ConcertTicket implementation class BasicConcertTicket implements ConcertTicket { @Override public String getDescription() { return "Concert ticket"; } @Override public double getCost() { return 450.0; } } // The ConcertTicket decorator abstract class ConcertTicketDecorator implements ConcertTicket { private final ConcertTicket decoratedTicket; public ConcertTicketDecorator(ConcertTicket decoratedTicket){ this.decoratedTicket = decoratedTicket; } public String getDescription() { return decoratedTicket.getDescription(); } public double getCost() { return decoratedTicket.getCost(); } } // A specific ConcertTicket decorator - VIPSpot class VIPSpot extends ConcertTicketDecorator { public VIPSpot(ConcertTicket decoratedTicket) { super(decoratedTicket); } @Override public String getDescription() { return super.getDescription() + ", VIP spot"; } @Override public double getCost() { return super.getCost() + 300.0; } }