一、什么是状态模式
State模式也叫状态模式,是行为设计模式的 一种。State模式允许通过改变对象的内部状态 而改变对象的行为,这个对象表现得就好像修改 了它的类一样。
二、状态模式的应用场景
状态模式主要解决的是当控制一个对象状态转 换的条件表达式过于复杂时的情况。把状态的判 断逻辑转译到表现不同状态的一系列类当中,可 以把复杂的判断逻辑简化。
三、状态模式的结构
四、状态模式的角色和职责
Context:用户对象 拥有一个State类型的成员,以标识对象的当前 状态;
State:接口或基类 封装与Context的特定状态相关的行为;
ConcreteState:接口实现类或子类 实现了一个与Context某个状态相关的行为。
1 public class Person { 2 private int hour; 3 4 public int getHour() { 5 return hour; 6 } 7 8 public void setHour(int hour) { 9 this.hour = hour; 10 } 11 12 public void doSomething(){ 13 if(hour == 7) { 14 System.out.println("吃早餐"); 15 } else if(hour == 12) { 16 System.out.println("吃中饭"); 17 } else if(hour == 18) { 18 System.out.println("吃晚饭"); 19 } else { 20 System.out.println(hour + "未定义"); 21 } 22 } 23 }
1 public class MainClass { 2 public static void main(String[] args) { 3 Person person = new Person(); 4 5 person.setHour(7); 6 person.doSomething(); 7 8 person.setHour(12); 9 person.doSomething(); 10 11 person.setHour(18); 12 person.doSomething(); 13 14 person.setHour(8); 15 person.doSomething(); 16 } 17 }
=================================================================
使用状态模式
人
1 public class Person { 2 private int hour; 3 private State state; 4 5 public int getHour() { 6 return hour; 7 } 8 9 public void setHour(int hour) { 10 this.hour = hour; 11 } 12 13 public void doSomething(){ 14 if(hour == 7) { 15 state = new MState(); 16 state.doSomething(); 17 } else if(hour == 12) { 18 state = new LState(); 19 state.doSomething(); 20 } else if(hour == 18) { 21 state = new SState(); 22 state.doSomething(); 23 } else { 24 state = new NoState(); 25 state.doSomething(); 26 } 27 } 28 }
状态 抽象
1 public abstract class State { 2 public abstract void doSomething(); 3 }
吃早餐
1 public class MState extends State { 2 3 public void doSomething() { 4 System.out.println("吃早餐"); 5 } 6 }
吃中午饭
1 public class LState extends State{ 2 3 public void doSomething() { 4 System.out.println("吃中饭"); 5 } 6 }
吃晚饭
1 public class SState extends State { 2 3 public void doSomething() { 4 System.out.println("吃晚饭"); 5 } 6 }
未定义
1 public class NoState extends State { 2 3 public void doSomething() { 4 System.out.println("未定义"); 5 } 6 }
测试
1 public class MainClass { 2 public static void main(String[] args) { 3 Person person = new Person(); 4 5 person.setHour(7); 6 person.doSomething(); 7 8 person.setHour(12); 9 person.doSomething(); 10 11 person.setHour(18); 12 person.doSomething(); 13 14 person.setHour(8); 15 person.doSomething(); 16 } 17 }