行为型模式之状态模式

Posted 756623607-zhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了行为型模式之状态模式相关的知识,希望对你有一定的参考价值。

 
一.定义
  状态模式(State Pattern) :允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象(Objects for States),状态模式是一种对象行为型模式。
 
二、模式结构成员构成

? Context: 环境类

? State: 抽象状态类

? ConcreteState: 具体状态类

技术分享图片

 

三.代码示例
技术分享图片
 1 /**
 2  * State
 3  * 抽象状态类
 4  */
 5 public interface State {
 6    public void doAction(Context context);
 7 }
 8 
 9 /**
10  * ConcreteState
11  * 具体状态类
12  */
13 public class StartState implements State {
14  
15    @Override
16    public void doAction(Context context) {
17       System.out.println("Player is in start state");
18       context.setState(this); 
19    }
20  
21    @Override
22    public String toString(){
23       return "Start State";
24    }
25 }
26 
27 /**
28  * ConcreteState
29  * 具体状态类
30  */
31 public class StopState implements State {
32  
33    @Override
34    public void doAction(Context context) {
35       System.out.println("Player is in stop state");
36       context.setState(this); 
37    }
38  
39    @Override
40    public String toString(){
41       return "Stop State";
42    }
43 }
44 
45 /**
46  * Context
47  * 环境类
48  */
49 public class Context {
50    private State state;
51  
52    public Context(){
53       state = null;
54    }
55  
56    public void setState(State state){
57       this.state = state;     
58    }
59  
60    public State getState(){
61       return state;
62    }
63 }
64 
65 /**
66  * client
67  */
68 public class Client {
69 
70     public static void main(String[] args) {
71         Context context = new Context();
72 
73         StartState startState = new StartState();
74         startState.doAction(context);
75 
76         System.out.println(context.getState().toString());
77 
78         StopState stopState = new StopState();
79         stopState.doAction(context);
80 
81         System.out.println(context.getState().toString());
82     }
83 }
View Code
 
四.优点和缺点分析
优点:
>枚举可能的状态,在枚举状态之前需要确定状态种类。
>将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为.
>允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句
>可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数
>封装了转换规则
 
缺点:
>状态模式的使用必然会增加系统类和对象的个数
>状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱
 
五.应用场景
>对象的行为依赖于它的状态(属性)并且可以根据它的状态改变而改变它的相关行为
>代码中包含大量与对象状态有关的条件语句,这些条件语句的出现,会导致代码的可维护性和灵活性变差,不能方便地增加和删除状态,使客户类与类库之间的耦合增强。在这些条件语句中包含了对象的行为,而且这些条件对应于对象的各种状态

以上是关于行为型模式之状态模式的主要内容,如果未能解决你的问题,请参考以下文章

行为型设计模式之备忘录模式

行为型模式之状态模式

行为型设计模式之备忘录模式

行为型模式之状态模式

23行为型模式之状态模式

JAVA SCRIPT设计模式--行为型--设计模式之State状态者模式(20)