1.状态模式概念
允许对象在其内部状态改变时改变它的行为.
2.状态模式组成
1)Context(上下文)
维护一个对当前状态的引用,并定义了一个接口,允许状态对象改变其行为。
2)State(状态)接口
定义了一个接口,封装了与上下文的一个特定状态相关的行为。
3)Concrete State(具体状态)
实现了状态接口,并定义了与上下文的一个特定状态相关的行为。
3.举个栗子:
例如小久的心情,小久的心情(state)会因为外部的环境影响而改变,
小久==>父母今天多给了100元零花钱==>心情高兴==>心情开心,开心的学习
小久==>今天犯错了,父母批评了小久===>心情伤心==>心情伤心,什么事也不想做
4.代码实现
1)Context实现类
package org.xiji.state;/*** 人相当于context*/
public class Person {/*** 心情*/private MoodState moodState;public void setMoodState(MoodState moodState){this.moodState = moodState;}/*** 根据心情的不同做事情*/public void doThing(){moodState.doSomething();}}
2)State
package org.xiji.state;/*** 心情状态*/
public interface MoodState {void doSomething();
}
3)Concrete State
开心
package org.xiji.state;public class Happy implements MoodState{@Overridepublic void doSomething() {System.out.println("心情开心,开心的学习");}
}
伤心
package org.xiji.state;public class Sad implements MoodState{@Overridepublic void doSomething() {System.out.println("心情伤心,什么事也不想做");}
}
4)测试类
package org.xiji.state;/*** 状态模式测试类*/
public class StateMain {public static void main(String[] args) {Person xijiu = new Person();Happy happy = new Happy();Sad sad = new Sad();//父母奖励小久100元 ==>小久心情开心System.out.println("小久今天被父母奖励100元,小久心情开心");xijiu.setMoodState(happy);xijiu.doThing();//小久犯错误被父母批评了 ,心情伤心System.out.println("小久今天被父母批评了,小久心情伤心");xijiu.setMoodState(sad);xijiu.doThing();}
}