1. 程式人生 > >一個例子理解裝飾器模式

一個例子理解裝飾器模式

什麼是裝飾器模式?

有些時候,我們希望為一個類新增一些功能,同時又不希望改變這個類原來的結構。

例如:我已經完成了一個日誌的介面和它的各個實現類,但是這些類只有輸出日誌到不同地方的功能,LoggerFileSystem能將日誌輸出到檔案系統(磁碟)中,LoggerCloud能將日誌輸出到雲端的某個檔案中。現在新需求來了,我想要在每條日誌輸出後順帶輸出這條日誌的時間,又不想去修改每個實現類的方法,這時候就能使用裝飾者模式,為這個介面編寫一個裝飾類,修飾原來的日誌輸出。(這只是一個簡單的例子,正常的日誌輸出一般都帶有時間)

類圖

enter description here

具體實現

  1. Logger介面,定義寫日誌介面方法log()
/**
 * @author zdxie
 * @Date 上午 8:18 2017/9/23 0023
 * @Description
 */
public interface Logger {
    public void log(String message);
}
  1. 實現兩個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); } }
  1. 為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