委托模式(代理模式)是一種常見的設(shè)計(jì)模式庆捺,委托模式使得我們可以用聚合來替代繼承滔以,將委托者與實(shí)際實(shí)現(xiàn)代碼分離出來氓拼,以達(dá)成解耦的目的。關(guān)于更多代理模式的相關(guān)介紹坏匪,這里就不詳細(xì)展開了撬统,不了解的同學(xué)請(qǐng)自行 Google……
Kotlin 在語(yǔ)言層面原生支持委托模式。包括類的委托和屬性的委托凭迹。
在 Android 里面苦囱,利用屬性委托,我們可以以非常簡(jiǎn)單的方式來讀寫 preferences朽砰。我們可以創(chuàng)建一個(gè)委托,當(dāng) get 被調(diào)用時(shí)去讀取 preferences 內(nèi)容漆弄,當(dāng) set 被調(diào)用時(shí)去執(zhí)行保存操作。
好了鋪墊說完撼唾,下面直接上代碼哥蔚。
首先是 SharedPreferences 的委托類:
//采用泛型實(shí)現(xiàn)會(huì)方便我們處理各種類型的 preferences
class Preference<T>(val context: Context, val name: String, val default: T)
: ReadWriteProperty<Any?, T> {
val prefs by lazy {
context.getSharedPreferences("default", Context.MODE_PRIVATE)
}
override fun getValue(thisRef: Any?, property: KProperty<*>)
: T {
return findPreference(name, default)
}
override fun setValue(thisRef: Any?, property: KProperty<*>,
value: T) {
putPreference(name, value)
}
//讀取 preferences
private fun <T> findPreference(name: String, default: T): T = with(prefs) {
val res: Any = when (default) {
is Long -> getLong(name, default)
is String -> getString(name, default)
is Int -> getInt(name, default)
is Boolean -> getBoolean(name, default)
is Float -> getFloat(name, default)
else -> throw IllegalArgumentException(
"This type can't be saved into Preferences")
}
res as T
}
//寫入 preferences
private fun <U> putPreference(name: String, value: U) = with(prefs.edit()) {
when (value) {
is Long -> putLong(name, value)
is String -> putString(name, value)
is Int -> putInt(name, value)
is Boolean -> putBoolean(name, value)
is Float -> putFloat(name, value)
else -> throw IllegalArgumentException("This type can't be saved into Preferences")
}.apply()
}
}
下面我們?cè)俣x一個(gè)新的委托渤愁,這樣我們可以更方便地訪問 SharedPreferences 的委托類:
object mPreferenceDelegates {
fun <T : Any> preference(context: Context, name: String, default: T) = Preference(context, name, default)
}
使用深夯,主要是兩個(gè)全局單例:
//偏好設(shè)置鍵
object PreferenceKey{
//偏好設(shè)置里是否接收消息推送的鍵
val isReceiveMessage = "isReceiveMessage"
}
//訪問用戶偏好設(shè)置
object mPreferenceSetting{
//是否接收消息推送,讀寫這條屬性就相當(dāng)于直接讀寫 preferences 里以 "isReceiveMessage" 為鍵的值
var isReceiveMessage:Boolean by mPreferenceDelegates.preference(App.instance,PreferenceKey.isReceiveMessage,true)
}
最后雹拄,所謂用戶偏好設(shè)置掌呜,就是首選項(xiàng)啦~