携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情
1.意图:
允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。
2.适用性:
- 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
- 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常,有多个操作包含着以相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。
3.状态(State)模式构成:
- 抽象状态(State)角色:定义一个接口,用于封装环境(Context)对象的一个特定的状态所对应的行为。
- 具体状态(ConcreteState)角色:每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。
- 环境(Context)角色:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态。
4.状态模式UML图:
5.状态模式UML序列图:
6.代码示例:
客户角色:
public class Client {
public static void main(String[] args) {
Car car = new Car();
car.pull();
car.pull();
car.pull();
car.pull();
}
}
环境角色:
public class Car {
private State current;
public Car() {
this.current = new Off();
System.out.println("新车生产出来,现在是空档");
}
public void setState(State state) {
this.current = state;
}
public void pull() {
current.pull(this);
}
}
抽象状态角色:
public abstract class State {
public abstract void pull(Car car);
}
具体状态角色:
public class Off extends State {
@Override
public void pull(Car car) {
car.setState(new Low());
System.out.println("低档");
}
}
public class Low extends State {
@Override
public void pull(Car car) {
car.setState(new Medium());
System.out.println("中档");
}
}
public class Medium extends State {
@Override
public void pull(Car car) {
car.setState(new High());
System.out.println("高档");
}
}
public class High extends State {
@Override
public void pull(Car car) {
car.setState(new Off());
System.out.println("空档");
}
}