在状态模式中,类的行为是基于它的状态改变的,这种类型的设计模式属于行为型模式。状态模式的结构跟策略模式的几乎一样,但其本质是不一样的。策略模式中的行为是彼此独立,能够相互替换的;而状态模式的行为是平行的,不同状态下其行为也是不一样的,具有不可替换性。策略模式的侧重点是提供不同的方法,状态模式的行为是由状态来决定,不同状态有不同的行为

  • 行为随状态改变而改变的场景
  • 条件、分支语句的代替者

实现

  • State:抽象类或者接口,定义对象的各种状态和行为
  • ConcreteState:实现抽象角色类,定义了本状态下的行为,即要做的事情
  • Context:定义客户端需要的接口,并且负责具体状态的切换

抽象状态类

  1. public interface PersonState {
  2. void movies();
  3. void shopping();
  4. }

具体状态类
实现抽象状态类的接口,比如人有单身狗和恋爱这两种状态

  1. public class DogState implements PersonState {
  2. @Override
  3. public void movies() {
  4. System.out.println("一个人偷偷看岛国大片");
  5. }
  6. @Override
  7. public void shopping() {
  8. //单身狗逛条毛街啊
  9. //空实现
  10. }
  11. }
  12. public class LoveState implements PersonState {
  13. @Override
  14. public void movies() {
  15. System.out.println("一起上电影院看大片~");
  16. }
  17. @Override
  18. public void shopping() {
  19. System.out.println("一起愉快的逛街去~");
  20. }
  21. }

环境类

  1. public class Context {
  2. private PersonState mPersonState;
  3. public void setPersonState(PersonState personState) {
  4. mPersonState = personState;
  5. }
  6. public void fallInLove() {
  7. System.out.println("恋爱了,陷入热恋状态:");
  8. setPersonState(new LoveState());
  9. }
  10. public void disappointmentInLove() {
  11. System.out.println("失恋了,变成单身狗状态:");
  12. setPersonState(new DogState());
  13. }
  14. public void movies() {
  15. mPersonState.movies();
  16. }
  17. public void shopping() {
  18. mPersonState.shopping();
  19. }

优点

  • 每个状态都是一个子类,易于扩展和维护
  • 将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为
  • 避免过多的条件语句,使得结构更清晰,提高代码的可维护性

缺点

  • 状态模式的使用必然会增加系统类和对象的个数

Android 中的应用

  • 暂时未想到

参考

技术文章:菜鸟教程-设计模式Android的设计模式-状态模式