《设计模式》对Decorator的描述:动态给一个对象添加一些额外职责。就添加功能来说,Decorator模式比生成子类更灵活。
Decorator让我感觉设计者非常聪明,这是个好有趣聪慧的模式,马上看例子:
1.不使用Decorator模式的设计:
a.需求:打印正文
java 代码
- public class Ticket{
- public void prtTicket(){
- System.out.println("Sales Ticket" );
- }
- }
b.需求改变:打印正文前,先打印Header
java 代码
- public class Ticket{
- public void prtTicket(){
- System.out.println("Header" );
- System.out.println("Sales Ticket" );
- }
- }
c.需求再度改变:正文后打印Footer
java 代码
- public class Ticket{
- public void prtTicket(){
- System.out.println("Header" );
- System.out.println("Sales Ticket" );
- System.out.println("Footer" );
- }
- }
2.使用Decorator后的设计:
java 代码
- abstract public class Component{
- abstract public void prtTicket();
- }
- abstract public class TicketDecorator extend Component {
- private Component myTrailer;
- public TicketDecorator(Component comp){
- myTrailer = comp;
- }
- public void callTrailer(){
- if (myTrailer != null )
- myTrailer.prtTicket();
- }
- }
- public class SaleTicket extend Component{
- public void prtTicket(){
- System.out.println("Sale Ticket" );
- }
- }
- public class Header extend TicketDecorator{
- public Header(Component comp){
- super (comp);
- }
- public void prtTicket(){
- System.out.println("Header" );
- super .callTrailer();
- }
- }
- public class Footer extend TicketDecorator{
- public Footer (Component comp){
- super (comp);
- }
- public void prtTicket(){
- super .callTrailer();
- System.out.println("Footer" );
- }
- }
- public class Test{
- public static void main(String args[]){
- Component c = new Header( new Footer( new SaleTicket()));
- c.prtTicket();
- }
- }
于是,无论添加多少个功能,每个Decorator都之关心自己的功能,我们能任意重排Decorator的顺序,无需改变任何代码。
在java io中用到了Decorator模式。