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{
@Override
public void doSomething() {
System.out.println("心情开心,开心的学习");
}
}
伤心
package org.xiji.state;
public class Sad implements MoodState{
@Override
public 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();
}
}