Android 原始碼的裝飾者模式

2021-09-29 22:13:59 字數 2011 閱讀 7268

動態地給乙個物件新增一些額外的職責。就增加功能來說,裝飾者模式相比生成子類更為靈活。

需要透明且動態地擴充套件類的功能時使用。

context 類在 android 中被稱為「上帝物件」,它本質是乙個抽象類,其在我們裝飾者模式裡相當於抽象元件,而在其內部定義了大量的抽象方法,比如我們經常會用到的 startactivity 方法。

...

public

abstract

void

startactivity

(@requirespermission intent intent);.

..public

abstract

void

startactivity

(@requirespermission intent intent,

@nullable bundle options);.

..

真正的實現是在 contextimpl 中完成的,contextimpl 繼承自 context 抽象類,並實現了 context 中的抽象方法。

@override

public

void

startactivity

(intent intent)

/** @hide */

@override

public

void

startactivityasuser

(intent intent, userhandle user)

@override

public

void

startactivity

(intent intent, bundle options)

mmainthread.

getinstrumentation()

.execstartactivity

(getoutercontext()

, mmainthread.()

, null,

(activity) null, intent,-1

, options)

;}

這裡 contextimpl 就相當於元件具體實現類,那麼誰來承擔裝飾者的身份呢?

public

class

activity

extends

implements

layoutinflater.factory2

, window.callback, keyevent.callback,

oncreatecontextmenulistener, componentcallbacks2,

window.onwindowdismissedcallback, windowcontrollercallback,

autofillmanager.autofillclient

public

class

extends

public

class

extends

context

/** * delegated to the base context. throws

* illegalstateexception if a base context has already been set.

* */

protected

void

attachbasecontext

(context base)

mbase = base;}.

..

@override

public

void

startactivity

(intent intent)

可以看出它呼叫了 contextimpl 中對應的方法。

03 裝飾者思想(借鑑日曆原始碼)

簡單描述 打個比方 乙個成型的產品,需要去裝飾,每個裝飾的人各自裝飾各自的,誰都不去影響到誰 他們只會自己的裝飾,其他人的裝飾本領都不會 最後全部裝飾的人都把自己的裝飾給做好了,最後乙個精美的產品就好了。中簡單方法 緊緊是描述 有乙個最終的功能模組需要去裝飾,在這個功能模組中定義乙個裝飾列表,並在相...

Java設計模式 裝飾者模

裝飾者模式,其實不難理解,簡單地說就是裝飾者和被裝飾者擁有共同的超類,裝飾者只是豐富了行為,拓展了功能,而型別是不變的。說起來可能比較抽象,接下來通過乙個簡單的例子來實現乙個裝飾者模式。動態的給乙個物件新增一些額外的職責或者功能,就增加功能來說,裝飾者模式相比生成子類更為靈活。大多數情況下被裝飾者不...

Android原始碼中的設計模式1 單例模

1 單例模式 實現方式簡單,應用也最為廣泛的一種設計模式。解決的問題 保證乙個類在記憶體中的物件唯一性。比如 多程式讀取乙個配置檔案時,建議配置檔案封裝成物件。會方便操作其中資料,又要保證多個程式讀到的是同乙個配置檔案物件,就需要該配置檔案物件在記憶體中是唯一的。像資料庫操作等,jdbc。那麼,如何...