我們為什麼使用裝飾器模式?
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...