在状态模式中,类的行为是基于它的状态改变的,这种类型的设计模式属于行为型模式。状态模式的结构跟策略模式的几乎一样,但其本质是不一样的。策略模式中的行为是彼此独立,能够相互替换的;而状态模式的行为是平行的,不同状态下其行为也是不一样的,具有不可替换性。策略模式的侧重点是提供不同的方法,状态模式的行为是由状态来决定,不同状态有不同的行为
场
- 行为随状态改变而改变的场景
- 条件、分支语句的代替者
实现
- State:抽象类或者接口,定义对象的各种状态和行为
- ConcreteState:实现抽象角色类,定义了本状态下的行为,即要做的事情
- Context:定义客户端需要的接口,并且负责具体状态的切换
抽象状态类
public interface PersonState {void movies();void shopping();}
具体状态类
实现抽象状态类的接口,比如人有单身狗和恋爱这两种状态
public class DogState implements PersonState {@Overridepublic void movies() {System.out.println("一个人偷偷看岛国大片");}@Overridepublic void shopping() {//单身狗逛条毛街啊//空实现}}public class LoveState implements PersonState {@Overridepublic void movies() {System.out.println("一起上电影院看大片~");}@Overridepublic 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 中的应用
- 暂时未想到
