對裝飾器模式的理解

2021-08-21 09:21:58 字數 2018 閱讀 9147

我們為什麼使用裝飾器模式?

log()定義日誌輸出的方法

/**

* created by aq on 2018/7/11.

*/public inte***ce logger

loggercloud和loggerfilesystem為原有的結構(我們未對日誌功能進行拓展時已存在)

/**

* created by aq on 2018/7/11.

*/public class loggercloud implements logger

}

/**

* created by aq on 2018/7/11.

*/public class loggerfilesystem implements logger

}

為logger編寫乙個裝飾器,拓展log()的功能,這個裝飾類要實現logger介面並且擁有乙個logger成員

/**

* created by aq on 2018/7/11.

*/public class decorator implements logger

@override

public void log()

}}

functionone和functiontwo的newfunction()即我們想要新增的功能

/**

* created by aq on 2018/7/11.

*/public class functiontwo extends decorator

@override

public void log()

public void functiontwo()

}

/**

* created by aq on 2018/7/11.

*/public class functionone extends decorator

public void newfunction()

@override

public void log()

}

main方法

public class main 

}

輸出結果為

log in cloud

log in cloud

new function one

log in cloud

new function one

new function two

結果分析

logger.log()呼叫的是loggercloud類中log()方法,輸出 log in cloud

logger1.log()呼叫的是functionone類中的log()方法,先執行super.log(),即functionone的父類decorator的log()方法,由於在構造logger1時傳入的值是logger,所以此時decorator的log()方法執行的是logger.log(),輸出log in cloud。然後執行到logger1.log()中的newfunction(),輸出new function one。

logger2.log()呼叫的是functiontwo類中的log()方法,先執行super.log(),即functiontwo的父類decorator的log()方法,由於在構造logger2時傳入的值是logger1,所以此時decorator的log()方法執行的是logger1.log(),

輸出 log in cloud

new function one

然後執行到logger2.log()中的newfunction(),

輸出new function two。

本文參考了

對Python裝飾器的個人理解

首先,裝飾器的的返回值是接力棒。被當做引數的函式作為返回值返回到裝飾器的內部函式,然後裝飾器返回值是內部函式,即最終裝飾器的返回值是當做引數的函式。列子 def square it func def new function args,kwargs result func args,kwargs s...

對Python裝飾器的個人理解方法

0.說明 在自己好好總結並對python裝飾器的執行過程進行分解之前,對於裝飾器雖然理解它的基本工作方式,但對於存在複雜引數的裝飾器 裝飾器和函式本身都有引數 總是會感到很模糊,即使這會弄懂了,下一次也很快忘記,其實本質上還是沒有多花時間去搞懂其中的細節問題。最近在對 python核心程式設計 做總...

裝飾模式理解

package 裝飾模式 核心戰術 public abstract class maintactics package 裝飾模式 核心業務類 public class cbatactics extends maintactics override public void success packag...