前言
上一篇提到了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