场景引入
生活中,对于同一件事,根据我们当时的所处心情不同,我们会做出不一样的行为。就类似:以我观物,物皆著我之色彩。所谓的状态模式就是这样,一个类中方法根据状态的不同,而采取不一样的行为。比如:你的心情有:开心、生气。然后行为有:笑、哭。一般的实现方法就如下面的代码:
public class Person {
private String state;
public Person(String state) {
this.state = state;
}
public void smile(){
if(state.equals("happy")){
System.out.println("我开心的笑了");
}else if(state.equals("sad")){
System.out.println("很生气,皮笑肉不笑");
}
}
public void cry(){
if(state.equals("happy")){
System.out.println("喜极而泣");
}else if(state.equals("sad")){
System.out.println("气哭");
}
}
}
从代码中,我们可以看的出来,当我们的状态非常的多的时候,方法就显得十分的臃肿。为了解决这个问题,我们可以把状态提取出来。状态模式实现见代码实现。
UML
代码实现
State
public interface State {
void smile();
void cry();
}
Happy
public class Happy implements State {
@Override
public void smile() {
System.out.println("开心的笑了");
}
@Override
public void cry() {
System.out.println("喜极而泣");
}
}
Sad
public class Sad implements State{
@Override
public void smile() {
System.out.println("伤心,皮笑肉不笑");
}
@Override
public void cry() {
System.out.println("气哭");
}
}
Person
public class Person {
private State state;
public Person(State state) {
this.state = state;
}
public void smile(){
state.smile();
}
public void cry(){
state.cry();
}
}
test
public class test {
public static void main(String[] args) {
Person happyPerson = new Person(new Happy());
happyPerson.smile();
happyPerson.cry();
Person sadPerson = new Person(new Sad());
sadPerson.smile();
sadPerson.cry();
}
}
写在最后
状态模式适合那种状态可以增加,但是行为不能增加的情况。行为指的是例子中的smile
、cry
。状态指的是例子中的happy
、sad
。因为状态增加只需要添加一个子类,但是行为增加就需要修改很多的代码。