Kotlin設(shè)計模式

前言

上一篇提到了Kotlin的單例模式(傳送門http://www.reibang.com/p/9e2d584e6a85)助被,本篇主要涉及其他的設(shè)計模式剖张,大部分與java的寫法一致切诀,像工廠和抽象工廠等一系列的跟java寫法是一樣所以沒有列舉出來,只是java代碼轉(zhuǎn)換為Kotlin代碼搔弄。在使用的時候根據(jù)具體場景使用就行幅虑。

1.建造者模式

建造者模式是為了構(gòu)建復(fù)雜而且多變的實例,Kotlin中使用apply函數(shù)實現(xiàn)

val dialog = Dialog(this).apply {
        setTitle("kotlin")
        setCancelable(true)
        setCanceledOnTouchOutside(true)
        //show()
    }

在apply函數(shù)里面可以直接調(diào)用show()方法顾犹,如果希望構(gòu)建實例和其他無關(guān)的操作分開倒庵,可以使用Type-Safe Builders

class Student (
            val model: String?,
            val year: Int
    ) {
        private constructor(builder: Builder) : this(builder.model, builder.year)

        class Builder {
            var model: String? = null
            var year: Int = -1

            fun build() = Student(this)
        }

        companion object {
            inline fun build(block: Builder.() -> Unit) = Builder().apply(block).build()
        }
    }

    // usage
    val student = Student.build {
        model = "Heweii"
        year = 1993
    }

2.原型模式

原型模式是以一個對象為原型,創(chuàng)建出一個新的對象炫刷。Kotlin因為使用 data class 時擎宝,會自動獲得equals、hashCode浑玛、toString和copy方法绍申,相對java簡便很多,copy方法可以克隆整個對象并且允許修改新對象某些屬性顾彰。

data class Film(var name: String, var content: String?, var actorList: String?)

    val film = Film("西游記", "极阅。。涨享。", "六小齡童筋搏。。厕隧。")
    val copy = film.copy(name = "西游記2")

3.適配器模式

Kotlin的實現(xiàn)方式和java類似

interface Target {
    fun request()
}

interface Adaptee {
    fun setView()
}

class Adapter(val wrapper: Adaptee) : Target {
    override fun request() {
        wrapper.setView()
    }
}

4.裝飾模式

kotli中獨有的擴展函數(shù)可以很簡便的做到裝飾模式

class Text(val text: String) {
    fun draw() = print(text)
}

fun Text.underline(decorated: Text.() -> Unit) {
    print("_")
    this.decorated()
    print("_")
}

// usage
Text("Hello").run {
    underline {
        draw()
    }
}

5.職責鏈模式

職責鏈模式通過建立一條鏈來組織請求的處理者奔脐,請求將沿著鏈進行傳遞,請求發(fā)送者無須知道請求的去向栏账,實現(xiàn)了請求發(fā)送者與處理者的解耦帖族。Kotlin 與java是一樣的處理方式

interface EventHandler {
    var next: EventHandler?
    fun handle(event: MotionEvent): Boolean
}

open class View : EventHandler {
    override var next: EventHandler? = null
    override fun handle(event: MotionEvent): Boolean {
        return onTouchEvent()
    }
    open fun onTouchEvent() : Boolean { 
        ...
        return false 
    }
}

open class ViewGroup : View() {
    override fun handle(event: MotionEvent): Boolean {
        if (onInterceptTouchEvent(event)) return onTouchEvent()
        else return next?.handle(event)!!
    }
    
    open fun onInterceptTouchEvent(event: MotionEvent): Boolean { // 是否攔截事件
        ...
        return false
    }
}

6.迭代器模式

迭代器模式提供一種遍歷聚合對象中的元素的一種方式栈源。Kotlin 中定義 operator fun iterator() 迭代器函數(shù)挡爵,或者是作為擴展函數(shù)時,可以在 for 循環(huán)中遍歷甚垦。

class Sentence(val words: List<String>)

operator fun Sentence.iterator(): Iterator<String> = words.iterator()
// or
operator fun Sentence.iterator(): Iterator<String> = object : Iterator<String> {
    val iterator = words.iterator()
    
    override fun hasNext() = iterator.hasNext()

    override fun next() = iterator.next()
}

7.觀察者模式

定義對象間的一種一對多的依賴關(guān)系茶鹃,當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并被自動更新艰亮。Kotlin中使用 observable properties可以很簡便的實現(xiàn)

interface TextChangedListener {
    fun onTextChanged(newText: String)
}

class TextView {
    var listener: TextChangedListener? = null

    var text: String by Delegates.observable("") { prop, old, new ->
        listener?.onTextChanged(new)
    }
}

8.策略模式

定義一系列的算法,把它們一個個封裝起來, 并且使它們可相互替換闭翩,kotlin可以使用高階函數(shù)來實現(xiàn)

class Customer(val name: String, val fee: Double, val discount: (Double) -> Double) {
    fun pricePerMonth() = discount(fee)
}

val studentDiscount = { fee: Double -> fee/2 }
val noDiscount = { fee: Double -> fee }

val student = Customer("Ned", 10.0, studentDiscount)
val regular = Customer("John", 10.0, noDiscount)

參考資料

https://www.runoob.com/design-pattern/strategy-pattern.html
https://www.runoob.com/kotlin/kotlin-tutorial.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市迄埃,隨后出現(xiàn)的幾起案子疗韵,更是在濱河造成了極大的恐慌,老刑警劉巖侄非,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蕉汪,死亡現(xiàn)場離奇詭異流译,居然都是意外死亡,警方通過查閱死者的電腦和手機者疤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門福澡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人驹马,你說我怎么就攤上這事革砸。” “怎么了糯累?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵算利,是天一觀的道長。 經(jīng)常有香客問我泳姐,道長笔时,這世上最難降的妖魔是什么穆趴? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任锈麸,我火速辦了婚禮邮绿,結(jié)果婚禮上拄氯,老公的妹妹穿的比我還像新娘卖鲤。我一直安慰自己甜熔,他們只是感情好器腋,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布伏钠。 她就那樣靜靜地躺著盗痒,像睡著了一般蚂蕴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上俯邓,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天骡楼,我揣著相機與錄音,去河邊找鬼稽鞭。 笑死鸟整,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的朦蕴。 我是一名探鬼主播篮条,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吩抓!你這毒婦竟也來了涉茧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤疹娶,失蹤者是張志新(化名)和其女友劉穎伴栓,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡钳垮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年除师,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扔枫。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡汛聚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出短荐,到底是詐尸還是另有隱情倚舀,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布忍宋,位于F島的核電站痕貌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏糠排。R本人自食惡果不足惜舵稠,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望入宦。 院中可真熱鬧哺徊,春花似錦、人聲如沸乾闰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涯肩。三九已至轿钠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間病苗,已是汗流浹背疗垛。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留硫朦,地道東北人贷腕。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像阵幸,于是被迫代替她去往敵國和親花履。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容