状态模式——学习笔记

状态模式的结构几乎和策略模式一模一样。状态模式是指代码中的方法的执行由状态来控制,在不同的状态下,执行不同的方法。状态模式的各个状态下的操作是平行的不可替换的,而策略模式的每种策略是相互独立的可替换的,这是两种设计模式的区别。

状态模式的定义:当一个对象的内部状态改变时允许改变其行为,这个对象看起来像是改变了其类。这是书中给的定义,前半句还好理解,但是后半句完全不明所以。下面来看下该模式的简单实现:

interface PhoneFunction{//抽象出手机功能接口
    abstract fun playGame()
    abstract fun call()
    abstract fun email()
    abstract fun SMS()
    abstract fun clock()
}
class OpenPhone : PhoneFunction {//开机状态下手机的功能
    override fun playGame() {
        System.out.println("开黑,速来!")
    }

    override fun call() {
        System.out.println("正在通话中。。。!")
    }

    override fun email() {
        System.out.println("邮件发送中。。。!")
    }

    override fun SMS() {
        System.out.println("主人,有新短信!")
    }

    override fun clock() {
        System.out.println("北京时间2018年9月6日16:21")
    }
}
class DownPhone : PhoneFunction {//关机状态下手机的功能
    override fun playGame() {
    }

    override fun call() {
    }

    override fun email() {
    }

    override fun SMS() {
    }

    override fun clock() {
    }
}
interface PowerCtrl{//抽象出一个手机状态控制接口
    abstract fun openPhone()
    abstract fun downPhone()
}


class PhoneCtrl : PowerCtrl {//手机状态控制类
    var ph : PhoneFunction?=null
    override fun openPhone() {
        setPhoneState(OpenPhone())
        System.out.println("手机开机了")
    }

    override fun downPhone() {
        setPhoneState(DownPhone())
        System.out.println("手机关机了")
    }
    fun setPhoneState(ph : PhoneFunction){
        this.ph=ph
    }
    fun playGame(){
        ph!!.playGame()
    }
    fun call(){
        ph!!.call()
    }
    fun email(){
        ph!!.email()
    }
    fun SMS(){
        ph!!.SMS()
    }
    fun clock(){
        ph!!.clock()
    }
}
fun main(args: Array<String>) {
    var phoneStrl : PhoneCtrl=PhoneCtrl()//获取手机状态控制类的实例
    phoneStrl.openPhone()//设置开机状态
    phoneStrl.playGame()//开始玩手游
    phoneStrl.call()//打电话
    phoneStrl.SMS()//查看短信
    phoneStrl.email()//发送邮件
    phoneStrl.downPhone()//设置关机状态
    phoneStrl.clock()//查看时间,此时手机为关机状态,不会显示
}

看完这段代码,感觉真的和策略模式好像,但是两者之间还是有区别的,策略模式只根据需求执行其中一种策略,但是状态模式,不管是哪种状态,都可以执行其行为,只是执行的结果不同;策略模式虽然选择的策略不同,但是其目的是相同的,而状态模式,不同的状态下,执行的效果是不一样的。

状态模式就学习到这里,个人的一些浅见,希望对大家有所帮助,有什么意见可以在评论里提出来,大家一起讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值