博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第20章 状态模式(State Pattern)
阅读量:6922 次
发布时间:2019-06-27

本文共 1708 字,大约阅读时间需要 5 分钟。

原文 

状态模式

 

     概述:

 

        当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

        状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。

 

     意图:

 

       允许一个对象在其内部状态改变时改变它的行为

 

     结构图:

 

   

 

 

      举例:

       

             在日常生活中最为熟悉的点灯开关,按一下开灯,在按一下关灯,我们用代码来实现这种效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
    
/// <summary>
    
/// 它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。
    
/// </summary>
  
public   
class 
Context
    
{
 
        
private 
AbstractState _state;
        
public 
AbstractState State
        
{
            
get
{
return 
_state;}
            
set 
{ _state=value;}
        
}
        
//初始状态
        
public 
Context(AbstractState state)
        
{
            
_state = state;
        
}
        
//按下开关
        
public 
void 
Press()
        
{
            
//传入当前的状态
            
_state.Press(
this
);
        
}
 
    
}
    
/// <summary>
    
/// 抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。
    
/// </summary>
  
public  
abstract 
class  
AbstractState
   
{
       
//按下动作
       
public  
abstract 
void 
Press(Context context);
     
   
}
    
/// <summary>
   
/// 具体状态(Concrete State):实现抽象状态定义的接口。开灯
    
/// </summary>
   
public 
class 
ConcreteStateOn:AbstractState
   
{
 
       
public 
override 
void 
Press(Context context)
       
{
           
Console.WriteLine(
"开灯"
);
           
//开灯了 那么久得把下一个动作设置成关灯
           
context.State = 
new 
ConcreteStateOff();
            
       
}
   
}
   
/// <summary>
   
/// 具体状态(Concrete State):实现抽象状态定义的接口。关灯
   
/// </summary>
   
public 
class 
ConcreteStateOff : AbstractState
   
{
 
       
public 
override 
void 
Press(Context context)
       
{
           
Console.WriteLine(
"关灯"
);
           
//关灯了就得把下一个动作设置成开灯
           
context.State = 
new 
ConcreteStateOn();
       
}
   
}

 

客户端调用:

1
2
3
4
5
6
7
8
9
10
11
    
class 
Program
    
{
        
static 
void 
Main(
string
[] args)
        
{
            
//灯处于关闭状态 第一次是开灯动作
            
Context context = 
new 
Context(
new 
ConcreteStateOn());
            
context.Press();
//按下开关
            
context.Press();
//在按下开关
            
Console.ReadLine();
        
}
    
}

 

       适用场景:

 

         1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。

         2.一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。

 

           

              :

转载地址:http://kukjl.baihongyu.com/

你可能感兴趣的文章
基于Cobbler+Kickstart构建网络安装环境(Linux 大规模部署安装)
查看>>
微信OpenID获取
查看>>
软件工程034
查看>>
Android学习笔记-----------布局(三)
查看>>
Haskell: install from source
查看>>
mxd文件批量更换版本
查看>>
cocos2dx骨骼动画Armature源码分析(三)
查看>>
JS API 4.x地图渲染之符号(二)(转载)
查看>>
Poj1258--Agri-Net(Prime)
查看>>
xcode6是否导入framework
查看>>
Linux 远程登录 | 菜鸟教程
查看>>
EAR文件结构
查看>>
[转] 通过jQuery Ajax使用FormData对象上传文件
查看>>
valid sudoku leetcode
查看>>
Activity 生命周期的回顾
查看>>
jsp(计算器)
查看>>
拆轮子系列--RxJava理解(三)--observeOn
查看>>
【JNI开发】之从零开始
查看>>
第一次迭代开发心得
查看>>
火莹升级Cocos引擎为3.17.2
查看>>