2012-12-25 68 views

回答

1

因爲Decorator模式的要點是裝點含有成分:

public interface Logger { 
    void print(String message); 
} 

public class ConsoleLogger implements Logger { 
    @Override 
    public void print(String message) { 
     System.out.println(message); 
    } 
} 

public class FileLogger implements Logger { 
    @Override 
    public void print(String message) { 
     // TODO write the message to a file 
    } 
} 

public WithCurrentDateLoggerDecorator implements Logger { 
    private Logger delegate; 

    public WithCurrentDateLoggerDecorator(Logger delegate) { 
     this.delegate = delegate; 
    } 

    @Override 
    public void print(String message) { 
     message = new Date() + " - " + message; 
     delegate.print(message); 
    } 
} 

使用上面,裝飾可用於任何地方,你會使用任何其他記錄,以及裝飾可以裝飾任何種類的記錄器(控制檯,文件,電子郵件,套接字等等)。它不關心具體的記錄器的功能(打印到控制檯或打印到文件)。它所做的就是裝飾具體的記錄器,在讓委託記錄器打印它之前,將當前日期添加到消息中。

如果您不需要組合(或者更確切地說,委派)就必須創建WithCurrentDateFileLoggerWithCurrentDateConsoleLogger(爲每個具體的記錄器添加一個子類)。由於組合數量多,每種其他裝飾或混凝土記錄器類型都會使要創建的類的數量爆炸。