状态模式的结构几乎和策略模式一模一样。状态模式是指代码中的方法的执行由状态来控制,在不同的状态下,执行不同的方法。状态模式的各个状态下的操作是平行的不可替换的,而策略模式的每种策略是相互独立的可替换的,这是两种设计模式的区别。
状态模式的定义:当一个对象的内部状态改变时允许改变其行为,这个对象看起来像是改变了其类。这是书中给的定义,前半句还好理解,但是后半句完全不明所以。下面来看下该模式的简单实现:
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()//查看时间,此时手机为关机状态,不会显示 }
看完这段代码,感觉真的和策略模式好像,但是两者之间还是有区别的,策略模式只根据需求执行其中一种策略,但是状态模式,不管是哪种状态,都可以执行其行为,只是执行的结果不同;策略模式虽然选择的策略不同,但是其目的是相同的,而状态模式,不同的状态下,执行的效果是不一样的。
状态模式就学习到这里,个人的一些浅见,希望对大家有所帮助,有什么意见可以在评论里提出来,大家一起讨论。