在状态模式中,类的行为是基于它的状态改变的,这种类型的设计模式属于行为型模式。状态模式的结构跟策略模式的几乎一样,但其本质是不一样的。策略模式中的行为是彼此独立,能够相互替换的;而状态模式的行为是平行的,不同状态下其行为也是不一样的,具有不可替换性。策略模式的侧重点是提供不同的方法,状态模式的行为是由状态来决定,不同状态有不同的行为
场
- 行为随状态改变而改变的场景
- 条件、分支语句的代替者
实现
- State:抽象类或者接口,定义对象的各种状态和行为
- ConcreteState:实现抽象角色类,定义了本状态下的行为,即要做的事情
- Context:定义客户端需要的接口,并且负责具体状态的切换
抽象状态类
public interface PersonState {
void movies();
void shopping();
}
具体状态类
实现抽象状态类的接口,比如人有单身狗和恋爱这两种状态
public class DogState implements PersonState {
@Override
public void movies() {
System.out.println("一个人偷偷看岛国大片");
}
@Override
public void shopping() {
//单身狗逛条毛街啊
//空实现
}
}
public class LoveState implements PersonState {
@Override
public void movies() {
System.out.println("一起上电影院看大片~");
}
@Override
public void shopping() {
System.out.println("一起愉快的逛街去~");
}
}
环境类
public class Context {
private PersonState mPersonState;
public void setPersonState(PersonState personState) {
mPersonState = personState;
}
public void fallInLove() {
System.out.println("恋爱了,陷入热恋状态:");
setPersonState(new LoveState());
}
public void disappointmentInLove() {
System.out.println("失恋了,变成单身狗状态:");
setPersonState(new DogState());
}
public void movies() {
mPersonState.movies();
}
public void shopping() {
mPersonState.shopping();
}
优点
- 每个状态都是一个子类,易于扩展和维护
- 将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为
- 避免过多的条件语句,使得结构更清晰,提高代码的可维护性
缺点
- 状态模式的使用必然会增加系统类和对象的个数
Android 中的应用
- 暂时未想到