一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - php設計模式之狀態模式實例分析【星際爭霸游戲案例】

php設計模式之狀態模式實例分析【星際爭霸游戲案例】

2020-06-06 15:45DavidHHuan PHP教程

這篇文章主要介紹了php設計模式之狀態模式,結合星際爭霸游戲案例形式分析了php狀態模式相關原理、使用技巧與注意事項,需要的朋友可以參考下

本文實例講述了php設計模式之狀態模式。分享給大家供大家參考,具體如下:

星際的一些兵種會有不止一種狀態,比如坦克可以架起來,機槍兵可以打興奮劑,甚至還有一些被動的,比如被蟲族女王噴灑綠色液體后,敵人的行動變慢。

如果按照一般的思路,每次我們對一個小兵進行操作的時候,比如一輛坦克,我們都要用if判斷他的狀態,這樣代碼中會有很多的if,else或者swith。

不過我們可以發現,我們需要的是他在某個狀態下的行為,如果把這些行為按照狀態封裝起來,就可以減少大量的判斷。

待解決的問題:封裝坦克的狀態,讓狀態自己去控制行為。

思路:把狀態作為屬性,兵種類本身只控制狀態的變化,具體的行為由狀態類定義。

狀態(State)模式示例:

?
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?php
  //坦克狀態的接口
  interface TankState
  {
    //坦克的攻擊方法
    public function attack();
  }
 
  //坦克普通狀態
  class TankState_Tank implements TankState
  {
    //坦克的攻擊方法
    public function attack()
    {
      //這里簡單的輸出當前狀態
      echo "普通狀態";
    }
  }
 
  //坦克架起來的狀態
  class TankState_Siege implements TankState
  {
    //坦克的攻擊方法
    public function attack()
    {
      //這里簡單的輸出當前狀態
      echo "架起來了";
    }
  }
 
  //坦克類
  class Tank
  {
    //狀態
    public $state;
 
    //坦克的攻擊方法
    public function __construct()
    {
      //新造出來的坦克當然是普通狀態
      $this->state = new TankState_Tank();
    }
 
    //設置狀態的方法,假設參數為玩家點擊的鍵盤
    public function setState($key)
    {
      //如果按了s
      if($key = 's')
      {
        $this->state = new TankState_Siege();
      }
      //如果按了t
      elseif($key = 't')
      {
        $this->state = new TankState_Tank();
      }
    }
 
    //坦克的攻擊方法
    public function attack()
    {
      //由當前狀態自己來處理攻擊
      $this->state->attack();
    }
  }
 
  //新造一輛坦克
  $tank = new Tank();
 
  //假設正好有個敵人路過,坦克就以普通模式攻擊了
  $tank->attack();
 
  //架起坦克
  $tank->setState('s');
 
  //坦克再次攻擊,這次是架起模式
  $tank->attack();
?>

用途總結:狀態模式可以將和狀態相關的行為和屬性封裝,除了切換狀態時,其它地方就不需要大量的判斷當前狀態,只要調用當前狀態的方法等。

實現總結:用一個接口規范狀態類需要實現的方法,比如上面的TankState規定了attack()。把各個狀態封裝成類,將不同狀態下的不同方法放入各自的狀態類,比如上面的攻擊方法,同時所有的狀態執行接口。原來的事務類,比如上面的Tank類,只負責狀態切換,一旦需要某一個方法的調用,只要交給當前狀態就可以了。

希望本文所述對大家PHP程序設計有所幫助。

原文鏈接:https://www.cnblogs.com/davidhhuan/p/4248198.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 麻豆视频免费在线播放 | 99视频全部看免费观 | 91会员| 98色花堂永久地址国产精品 | 国内精品91最新在线观看 | 国产成人精品第一区二区 | 国产成人亚洲综合a∨婷婷 国产成人亚洲精品乱码在线观看 | 亚洲成年人专区 | 精品成人一区二区 | 国内精品久久久久久久久 | 亚洲码在线观看 | 国产盗摄wc厕所撒尿视频 | 男人午夜禁片在线观看 | 国产精品微拍 | 欧式午夜理伦三级在线观看 | 高清免费毛片 | 亚洲国产区男人本色在线观看欧美 | 国产成人综合精品一区 | 国产成人精品午夜视频' | 1024国产高清精品推荐 | 近亲乱中文字幕 | 婷婷在线观看香蕉五月天 | 成人观看免费大片在线观看 | 青青青手机在线观看 | 国产白虎| 四虎精品成人免费影视 | 好吊操这里有精品 | 免费黄色小说 | 四虎免费永久观看 | 91真人毛片一级在线播放 | 久草在线福利资站免费视频 | 国内亚州视频在线观看 | 456亚洲人成高清在线 | 干美女视频 | 成人涩涩屋福利视频 | 98国产视频 | 亚洲swag精品自拍一区 | 男人午夜禁片在线观看 | 五月婷婷在线免费观看 | 日韩欧美一区二区在线观看 | 第一国内永久免费福利视频 |