若转载教程,请注明出自SW-X框架官方文档1

    1. <?php
    2. /**
    3. * 设计模式之状态模式
    4. * 使用场景 大量和对象状态相关的条件语句
    5. * 小黄牛
    6. */
    7. header("Content-type: text/html; charset=utf-8");
    8. /**
    9. *
    10. * 派生出相关的接口状态
    11. */
    12. interface IState{
    13. function WriteCode($Work);
    14. }
    15. /**
    16. * 春季
    17. */
    18. class AState implements IState{
    19. function WriteCode($Work){
    20. if($Work->hour == '春'){
    21. echo '春季,要下雨啦!<br/>';
    22. }else{
    23. # 调用回调方法,去访问夏季方法
    24. $Work->SetState(new BState());
    25. $Work->WriteCode();
    26. }
    27. }
    28. }
    29. /**
    30. * 夏季
    31. */
    32. class BState implements IState{
    33. function WriteCode($Work){
    34. if($Work->hour == '夏'){
    35. echo '夏季,好热额!<br/>';
    36. }else{
    37. # 调用回调方法,去访问秋季方法
    38. $Work->SetState(new CState());
    39. $Work->WriteCode();
    40. }
    41. }
    42. }
    43. /**
    44. * 秋季
    45. */
    46. class CState implements IState{
    47. function WriteCode($Work){
    48. if($Work->hour == '秋'){
    49. echo '秋季,恋爱的季节!<br/>';
    50. }else{
    51. # 调用回调方法,去访问冬季方法
    52. $Work->SetState(new DState());
    53. $Work->WriteCode();
    54. }
    55. }
    56. }
    57. /**
    58. * 冬季
    59. */
    60. class DState implements IState{
    61. function WriteCode($Work){
    62. if($Work->hour == '冬'){
    63. echo '冬季,浪漫的季节!<br/>';
    64. }else{
    65. echo '你不是地球人!<br/>';
    66. }
    67. }
    68. }
    69. /**
    70. * 处理季节筛选
    71. */
    72. class Work{
    73. public $hour; // 季节成员
    74. private $current; // 季节对象实例
    75. public $isDone;
    76. /**
    77. * 默认选择第一个筛选项
    78. */
    79. public function __construct(){
    80. $this->current = new AState();
    81. }
    82. /**
    83. * 当筛选不正确时,调用该方法继续向下筛选
    84. */
    85. public function SetState($S){
    86. $this->current = $S;
    87. }
    88. /**
    89. * 调用这个方法,使用筛选
    90. */
    91. public function WriteCode(){
    92. $this->current->WriteCode($this);
    93. }
    94. }
    95. # 实例DEMO
    96. $obj = new Work();
    97. $obj->hour = '春';
    98. $obj->WriteCode();
    99. $obj->hour = '夏';
    100. $obj->WriteCode();
    101. $obj->hour = '秋';
    102. $obj->WriteCode();
    103. $obj->hour = '冬';
    104. $obj->WriteCode();
    105. $obj->hour = '小黄牛';
    106. $obj->WriteCode();

    浏览器输出

    1. 春季,要下雨啦!
    2. 夏季,好热额!
    3. 秋季,恋爱的季节!
    4. 冬季,浪漫的季节!
    5. 你不是地球人!

    状态模式1

    1. 上下文环境(Work):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的具体对象来处理。
    2. 抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。
    3. 具体状态(AmState):实现抽象状态定义的接口。

    应用场景

    1. 当一个对象的条件表达式过于复杂的情况下,可以使用状态模式,把复杂的判断进行逻辑简化(有点类似递归向下的模式)。