状态模式,事物都是不断在演变,面向对象是对现实世界的抽象,所以对象某些时候也会发生状态改变,为了容易处理这些状态发生改变的的这些对象,诞生了状态模式。
状态模式即系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不同时可以使用状态模式。
状态模式将发生改变的状态抽象出来形成一个状态类,便于进行处理。
状态模式UML类图:
示例代码:
环境类:
/*****
* 环境类,其中某些状态发生改变,抽象出来形成状态类(在本例中为季节类)
* 环境类其实才是真正拥有状态的对象
* @author wjw
*
*/
public class Context {
private State state;//维持一个状态引用
private int temperature;//温度属性
public Context(){
//初始化为春季状态
state = new SpringState(this);
}
public void setState(State state){
this.state = state;
}
/****
* 环境温度改变
*/
public void changeTemperature(){
state.changeTemperature();
}
}
抽象季节状态类:
/*****
* 抽象状态类,专门用于封装发生改变的状态
* @author wjw
*
*/
public abstract class State {
protected Context context;
protected State(Context context){
this.context = context;
}
public abstract void changeTemperature();//温度改变
}
春夏秋冬四季具体状态类:
/****
* 春季状态类
* @author wjw
*
*/
public class SpringState extends State{
protected SpringState(Context context) {
super(context);
System.out.println("来到了春季,万物复苏的季节!");
// TODO Auto-generated constructor stub
}
@Override
public void changeTemperature() {
// TODO Auto-generated method stub
context.setState(new SummerState(context));
}
}
/****
* 夏季状态类
* @author wjw
*
*/
public class SummerState extends State{
protected SummerState(Context context) {
super(context);
// TODO Auto-generated constructor stub
System.out.println("来到了夏季,骄阳似火的季节!");
}
@Override
public void changeTemperature() {
// TODO Auto-generated method stub
context.setState(new AutumnState(context));
}
}
/*****
* 秋季状态类
* @author wjw
*
*/
public class AutumnState extends State{
protected AutumnState(Context context) {
super(context);
// TODO Auto-generated constructor stub
System.out.println("来到了秋季,硕果累累的季节!");
}
@Override
public void changeTemperature() {
// TODO Auto-generated method stub
context.setState(new WinterState(context));
}
}
/****
* 冬季状态类
* @author wjw
*
*/
public class WinterState extends State{
protected WinterState(Context context) {
super(context);
// TODO Auto-generated constructor stub
System.out.println("来到了冬季,白雪皑皑的季节!");
}
@Override
public void changeTemperature() {
// TODO Auto-generated method stub
context.setState(new SpringState(context));
}
}
Main类:
public class Main {
public static void main(String[] args) {
Context context = new Context();//new一个环境对象,初始化环境为夏季
context.changeTemperature();//温度改变,季节改变
context.changeTemperature();//温度改变,季节改变
context.changeTemperature();//温度改变,季节改变
context.changeTemperature();//温度改变,季节改变
}
}
运行结果:
来到了春季,万物复苏的季节!
来到了夏季,骄阳似火的季节!
来到了秋季,硕果累累的季节!
来到了冬季,白雪皑皑的季节!
来到了春季,万物复苏的季节!
说明:
以上实例模拟了温度改变引起的环境类中季节状态的变化。上面例子不难理解,主要在真正运用的时候能将复杂对象的状态类抽象出来。
状态模式:就是将某个复杂环境类中变化的状态抽象出来,便于灵活处理,使系统容易扩展且理解简单。
如有错误,欢迎指正
end