状态模式:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
状态模式的使用场景:
1、一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为;
2、代码中包含大量与状态有关的条件语句,例如,一个操作中含有庞大的多分枝语句(if-else 或者 switch-case),且这些分支依赖于该对象的状态,改为用多态来实现的一个具体实例。
组成:
环境类(Context): 定义客户感兴趣的接口。维护一个ConcreteState子类的实例,这个实例定义当前状态。
抽象状态类(State): 定义一个接口以封装与Context的一个特定状态相关的行为。
状态模式的使用场景:
1、一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为;
2、代码中包含大量与状态有关的条件语句,例如,一个操作中含有庞大的多分枝语句(if-else 或者 switch-case),且这些分支依赖于该对象的状态,改为用多态来实现的一个具体实例。
组成:
环境类(Context): 定义客户感兴趣的接口。维护一个ConcreteState子类的实例,这个实例定义当前状态。
抽象状态类(State): 定义一个接口以封装与Context的一个特定状态相关的行为。
具体状态类(ConcreteState): 每一子类实现一个与Context的一个状态相关的行为。
图片来自网络:
实例:
以《重构改善既有代码的设计》书中例子说明,影片分为普通片,儿童片,和新片。不同影片类型有不同价格和计算方式。
//抽象状态类(State)
public interface Price{
int getPrice();
}
//儿童片
public class ChildPrice implents Price{
public int getPrice(){
System.out.print("ChildPrice");
}
}
//新片
public class NewReleasePrice implents Price{
public int getPrice(){
System.out.print("NewReleasePrice");
}
}
//普通片
public class RegularPrice implents Price{
public int getPrice(){
System.out.print("RegularPrice");
}
}
//环境类(Context)
public class Movie{
private Price price;
int getPrice(){
price.getPrice();
}
public void setPrice(int arg){
switch(arg){
case REGULAR:
price=new RegularPrice();
break;
case CHILD:
price=new ChildPrice();
break;
case NEW_RELEASE:
price=new NewReleasePrice();
break;
}
}
}
public class Test{
public static void main(String[] args) {
Movie movie = new Movie();
movie.setPrice(0);//REGULAR==0
movie.getPrice();
movie.setPrice(1);//CHILD==1
movie.getPrice();
movie.setPrice(2);//NEW_RELEASE==2
movie.getPrice();
}
}