Java设计模式之二十三(状态模式)

来源:互联网 发布:小学网络辅导班 编辑:程序博客网 时间:2024/05/20 11:24

一、什么是状态模式

State模式也叫状态模式,是行为设计模式的一种。State模式允许通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样。 


二、状态模式的应用场景

状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转译到表现不同状态的一系列类当中,可以把复杂的判断逻辑简化。


三、状态模式的结构


四、状态模式的角色和职责

Context:用户对象拥有一个State类型的成员,以标识对象的当前状态; 


State:接口或基类封装与Context的特定状态相关的行为; 


ConcreteState:接口实现类或子类实现了一个与Context某个状态相关的行为。


代码实现:

Context:

package com.qianyan.ex;public class Person {//吃饭时间private int hour;//状态引用private State state;public Person() {state = new MState();}public int getHour() {return hour;}public void setHour(int hour) {this.hour = hour;}public State getState() {return state;}public void setState(State state) {this.state = state;}public void doSomething() {state.doSomething(this);this.state = new MState();}}

State:
package com.qianyan.ex;public abstract class State {public abstract void doSomething(Person person);}

ConcreteState:
package com.qianyan.ex;//早饭public class MState extends State {@Overridepublic void doSomething(Person person) {if(person.getHour() == 7)System.out.println("吃早饭");else {person.setState(new LState());person.doSomething();}}}

package com.qianyan.ex;//午饭public class LState extends State {@Overridepublic void doSomething(Person person) {if(person.getHour() == 12)System.out.println("吃中饭");else{person.setState(new SState());person.doSomething();}}}

package com.qianyan.ex;//晚饭public class SState extends State {@Overridepublic void doSomething(Person person) {if(person.getHour() == 18)System.out.println("吃晚饭");else{person.setState(new NoState());person.doSomething();}}}

package com.qianyan.ex;public class NoState extends State {@Overridepublic void doSomething(Person person) {System.out.println(person.getHour() + "未定义");}}

测试类:
package com.qianyan.ex;public class MainClass {public static void main(String[] args) {Person person = new Person();person.setHour(7);person.doSomething();person.setHour(12);person.doSomething();person.setHour(18);person.doSomething();person.setHour(20);person.doSomething();person.setHour(7);person.doSomething();person.setHour(18);person.doSomething();}}

测试结果:
吃早饭吃中饭吃晚饭20未定义吃早饭吃晚饭



原创粉丝点击