一個例子理解裝飾器模式
阿新 • • 發佈:2019-01-25
什麼是裝飾器模式?
有些時候,我們希望為一個類新增一些功能,同時又不希望改變這個類原來的結構。
例如:我已經完成了一個日誌的介面和它的各個實現類,但是這些類只有輸出日誌到不同地方的功能,LoggerFileSystem能將日誌輸出到檔案系統(磁碟)中,LoggerCloud能將日誌輸出到雲端的某個檔案中。現在新需求來了,我想要在每條日誌輸出後順帶輸出這條日誌的時間,又不想去修改每個實現類的方法,這時候就能使用裝飾者模式,為這個介面編寫一個裝飾類,修飾原來的日誌輸出。(這只是一個簡單的例子,正常的日誌輸出一般都帶有時間)
類圖
具體實現
- Logger介面,定義寫日誌介面方法log()
/**
* @author zdxie
* @Date 上午 8:18 2017/9/23 0023
* @Description
*/
public interface Logger {
public void log(String message);
}
- 實現兩個Logger實現類:LoggerFileSystem、LoggerCloud
/**
* @author zdxie
* @Date 上午 8:19 2017/9/23 0023
* @Description
*/
public class LoggerFileSystem implements Logger{
public void log(String message) {
System.out.println("Log into FileSystem:" + message);
}
}
/**
* @author zdxie
* @Date 上午 8:32 2017/9/23 0023
* @Description
*/
public class LoggerCloud implements Logger{
public void log(String message) {
System.out.println("Log into CloudSystem:" + message);
}
}
- 為Logger編寫一個裝飾器,在輸入日之後輸出當前時間,這個裝飾類要實現Logger介面並且擁有一個Logger成員變數。
import java.util.Calendar;
/**
* @author zdxie
* @Date 上午 8:38 2017/9/23 0023
* @Description
*/
public class TimeLoggerDecorator implements Logger {
private Logger decoratorLogger;
public TimeLoggerDecorator(Logger decoratorLogger) {
this.decoratorLogger = decoratorLogger;
}
public void log(String message){
decoratorLogger.log(message);
logTime();
}
public void logTime(){
System.out.println(Calendar.getInstance().getTime());
}
}
測試輸出
/**
* @author zdxie
* @Date 上午 8:40 2017/9/23 0023
* @Description
*/
public class LoggerTest {
public static void main(String[] args){
Logger logger1 = new TimeLoggerDecorator(new LoggerFileSystem());
logger1.log("登入系統...");
Logger logger2 = new TimeLoggerDecorator(new LoggerCloud());
logger1.log("登入系統...");
}
}
結果:
Log into FileSystem:登入系統...
Sat Sep 23 09:31:39 GMT+08:00 2017
Log into FileSystem:登入系統...
Sat Sep 23 09:31:39 GMT+08:00 2017