Kotlin设计模式-状态

来源:互联网 发布:矩阵的雅可比矩阵 编辑:程序博客网 时间:2024/06/05 10:39

前言

(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。

摘自百度百科-状态模式
简单来说就是:允许一个对象在其内部状态改变时改变它的行为。

Kotlin中的状态模式

可以使用sealed class(密封类),来简化状态之间的关系,之前在Java 中,可以使用父类或接口的方式来实现,但是在Kotlin中sealed class(密封类)可以简化这样的实现。

Ktolin sealed class(密封类)

此处仅展示Kotlin 1.1之后的 sealed class(密封类)特性。

sealed class Expr    data class Const(val number: Double) : Expr()    data class Sum(val e1: Expr, val e2: Expr) : Expr()    object NotANumber : Expr()      

sealed class 不可以被其他类继承,其子类必须在同一文件中,但其子类的子类可以放在其他文件中。
when 语句对sealed class 有功能增强,可以在when语句中直接使用。

show me code

//kotlin 1.1 sealed class 可以没有{}sealed class LoginState {    class Logout : LoginState()    class Login(val userName: String) : LoginState()}class LoginPresenter {    private var state: LoginState = Logout()    fun loginUser(userLogin: String) {        state = Login(userLogin)    }    fun logoutUser() {        state = Logout()    }    val isLogin: Boolean        get() {            when (state) {                is Login -> return true                else -> return false            }        }    val userLogin: String        get() {            when (state) {                is Login -> return (state as Login).userName                is Logout -> return "Unknown"            }        }    override fun toString(): String {        return "User '$userLogin' is logged in: $isLogin"    }}

调用代码

val loginPresenter = LoginPresenter()loginPresenter.loginUser("admin")println(loginPresenter)loginPresenter.logoutUser()println(loginPresenter)