gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

PHP中什么是狀態模式?通過實例來了解它

在之前的文章《一起聊聊PHP中的單例模式》中我們介紹了PHP中的單例模式,下面本篇文章帶大家了解一下PHP設計模式中的狀態模式

PHP中什么是狀態模式?通過實例來了解它

狀態模式從字面上其實并不是很好理解。這里的狀態是什么意思呢?保存狀態?那不就是備忘錄模式了。其實,這里的狀態是類的狀態,通過改變類的某個狀態,讓這個類感覺像是換了一個類一樣。說起來有點拗口吧,先學習概念之后再看。

Gof類圖及解釋

GoF定義:允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類

GoF類圖

PHP中什么是狀態模式?通過實例來了解它

代碼實現

class Context {     private $state;     public function SetState(State $state): void     {         $this->state = $state;     }     public function Request(): void     {         $this->state = $this->state->Handle();     } }

一個上下文類,也可以看作是目標類,它的內部有一個狀態對象。當調用Request()的時候,去調用狀態類的Handle()方法。目的是當前上下文類狀態的變化都由外部的這個狀態類來進行操縱。

interface State {     public function Handle(): State; }  class ConcreteStateA implements State {     public function Handle(): State     {         echo '當前是A狀態', PHP_EOL;         return new ConcreteStateB();     } }  class ConcreteStateB implements State {     public function Handle(): State     {         echo '當前是B狀態', PHP_EOL;         return new ConcreteStateA();     } }

抽象狀態接口及兩個具體實現。這兩個具體實現實際上是在相互調用。實現的效果就是上下文類每調用一次Request()方法,內部的狀態類就變成別一個狀態。就像一個開關,在打開與關閉中來回切換一樣。

$c = new Context(); $stateA = new ConcreteStateA(); $c->SetState($stateA); $c->Request(); $c->Request(); $c->Request(); $c->Request();

客戶端的實現,實例化上下文對象并設置初始的狀態,然后通過不停的調用Request()對象來實現開關狀態的切換。

  • 看出門道了嘛?這里把狀態的變化給封裝到外部的實現類去了,并不是這個上下文或者目標類內部來進行狀態的切換了
  • 那么狀態模式的意義呢?這個默認類圖的例子過于簡單,其實狀態模式的真正目的是為了解決復雜的if嵌套問題的,把復雜的if嵌套條件放到一個個的外部狀態類中去判斷,在后面的實例中我們會看到
  • 適用于:一個對象的行為取決于它的狀態,并且它的必須在運行時刻根據狀態改變自己的行為;一個操作中含有大量的多分支條件語句,且這些分支依賴于該對象的狀態;
  • 狀態模式的特點是:它將與特定狀態相關的行為局部化;它使得狀態轉換顯式化;State對象可以被共享;
  • 常見于訂單系統、會員系統、OA系統中,也就是流程中會出現各種狀態變化的情況,都可以使用狀態模式來進行整體的設計與架構

我們的手機系統內定制了自己的商城系統,可以在手機上方便的下單購買我們的商品。一個訂單(Context)會有多種狀態(State),比如未支付、已支付、訂單完成、訂單退款等等一大堆狀態。我們把這些狀態都放在了對應的狀態類里去實現,不同的狀態類都會再去調用該狀態下一步的動作,比如已支付后就等待收貨、退款后就等待買家填寫物流單號等,這樣,狀態模式就在我們的商城中被靈活的運用起來咯!!

完整代碼:https://github.com/zhangyue0503/designpatterns-php/blob/master/22.state/source/state.php

實例

通常的商城應用中都會有會員體系的存在,一般等級越高的會員可以享受的折扣也會越多,這個時候,運用狀態模式就能很輕松的獲得會員的等級折扣。當然,最主要的是,使用狀態模式可以在需要添加或者刪除會員等級時只添加對應的會員折扣狀態子類就可以了。其他業務代碼都不需要變動,我們一起來看看具體實現吧!

會員折扣圖

PHP中什么是狀態模式?通過實例來了解它

完整源碼:https://github.com/zhangyue0503/designpatterns-php/blob/master/22.state/source/state-member.php

<?php  class Member {     private $state;     private $score;      public function SetState($state)     {         $this->state = $state;     }      public function SetScore($score)     {         $this->score = $score;     }      public function GetScore()     {         return $this->score;     }      public function discount()     {         return $this->state->discount($this);     } }  interface State {     public function discount($member); }  class PlatinumMemeberState implements State {     public function discount($member)     {         if ($member->GetScore() >= 1000) {             return 0.80;         } else {             $member->SetState(new GoldMemberState());             return $member->discount();         }     } }  class GoldMemberState implements State {     public function discount($member)     {         if ($member->GetScore() >= 800) {             return 0.85;         } else {             $member->SetState(new SilverMemberState());             return $member->discount();         }     } }  class SilverMemberState implements State {     public function discount($member)     {         if ($member->GetScore() >= 500) {             return 0.90;         } else {             $member->SetState(new GeneralMemberState());             return $member->discount();         }     } }  class GeneralMemberState implements State {     public function discount($member)     {         return 0.95;     } }  $m = new Member(); $m->SetState(new PlatinumMemeberState());  $m->SetScore(1200); echo '當前會員' . $m->GetScore() . '積分,折扣為:' . $m->discount(), PHP_EOL;  $m->SetScore(990); echo '當前會員' . $m->GetScore() . '積分,折扣為:' . $m->discount(), PHP_EOL;  $m->SetScore(660); echo '當前會員' . $m->GetScore() . '積分,折扣為:' . $m->discount(), PHP_EOL;  $m->SetScore(10); echo '當前會員' . $m->GetScore() . '積分,折扣為:' . $m->discount(), PHP_EOL;

說明

  • 如果不使用狀態模式,在Member的discount()方法中,我們可能需要寫很多層if…else…判斷條件
  • 同時,這也帶來了方法體會越來越長,越來越難以維護的問題
  • 狀態模式正是為了解決這個問題而存在的
  • 當discount()行為的結果依賴于Member對象本身的狀態(會員分)時,狀態模式就是最佳的選擇了,也就是上面所說的一個對象的行為取決于它的狀態

原文地址:https://juejin.cn/post/6844903991562731534

作者:硬核項目經理

推薦學習:《PHP視頻教程》

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
欧美性视频在线播放| 成人免费视频久久| 日韩在线综合网| 欧美大片在线播放| 男人的天堂99| 污污网站在线观看视频| 爽爽爽在线观看| 日本一级黄视频| 国产精品69页| 久久出品必属精品| 少妇高潮毛片色欲ava片| 免费一级特黄特色毛片久久看| 国产乱子伦农村叉叉叉| 蜜臀久久99精品久久久酒店新书 | 国产成人无码a区在线观看视频| 国内精品视频一区二区三区| 国产精品亚洲二区在线观看| 99国产精品久久久久久| 日本中文字幕亚洲| 日韩不卡一二三| 无码人妻精品一区二区三区在线| 韩国日本美国免费毛片| 日b视频免费观看| 天天操天天干天天做| 成人性视频欧美一区二区三区| 无码人妻aⅴ一区二区三区日本| 免费日韩中文字幕| 欧美视频免费看欧美视频| 日本 片 成人 在线| 女人另类性混交zo| 1024av视频| 日韩中文字幕在线视频观看| 精品日韩在线播放| 一区二区三区免费播放| 97国产精东麻豆人妻电影| 又大又硬又爽免费视频| 精品视频在线观看一区二区| jizzzz日本| 91aaa精品| 国产1区2区3区中文字幕| 国产精品亚洲天堂| 免费激情视频在线观看| 日韩精品一区二区三区久久| 小说区视频区图片区| 日本网站在线看| 日韩xxxx视频| 亚洲熟妇av一区二区三区漫画| 水蜜桃色314在线观看| 久草热视频在线观看| 女人和拘做爰正片视频| 37pao成人国产永久免费视频| 妓院一钑片免看黄大片| 婷婷激情5月天| 久青草视频在线播放| 免费黄色日本网站| 九一精品久久久| 男人添女人下部高潮视频在观看| 日日碰狠狠躁久久躁婷婷| 欧美美女一级片| 欧美极品欧美精品欧美| 国产精品99久久久久久大便| 国产午夜大地久久| 国产精品久久久久久久99| 能在线观看的av| 熟妇熟女乱妇乱女网站| www.欧美日本| 日本特黄在线观看| 亚洲成人av免费看| 青青草精品视频在线| 亚洲国产欧美91| 国内自拍视频网| 北条麻妃在线一区| 亚洲精品乱码久久久久久自慰| 日本黄xxxxxxxxx100| 免费黄频在线观看| 黄色永久免费网站| 黄色国产小视频| 日本成人在线免费视频| 日日摸天天爽天天爽视频| 青娱乐自拍偷拍| 春日野结衣av| 日韩精品无码一区二区三区免费| 日韩精品一区二区三区久久| www.99热这里只有精品| av黄色在线网站| 精品免费国产一区二区| 国产精品拍拍拍| 污版视频在线观看| 久久久久久久久久久久久国产| 免费看黄色a级片| 国产69精品久久久久999小说| 黄在线观看网站| 亚洲国产日韩欧美在线观看| 午夜免费视频网站| 欧美无砖专区免费| 婷婷六月天在线| 免费看日b视频| mm131亚洲精品| 丁香花在线影院观看在线播放| 熟妇人妻无乱码中文字幕真矢织江| 免费看a级黄色片| 老司机午夜免费福利视频| 日日碰狠狠丁香久燥| 成人av在线不卡| 在线不卡一区二区三区| 日本www在线播放| 成人毛片100部免费看| 狠狠躁狠狠躁视频专区| 东北少妇不带套对白| 黑人巨大国产9丨视频| 亚洲黄色av网址| 国产精品一区二区羞羞答答| 六月婷婷在线视频| 欧美大黑帍在线播放| 三年中文在线观看免费大全中国| gogogo高清免费观看在线视频| 中文字幕の友人北条麻妃| 日本一二三区在线| 中文字幕第36页| 俄罗斯av网站| 欧美国产日韩激情| 路边理发店露脸熟妇泻火| 强开小嫩苞一区二区三区网站| 国内外成人免费激情视频| youjizz.com在线观看| 久久人人爽人人片| 成年人在线看片| 黄色一级片免费的| 久久精品99国产| 青青草原成人网| 日韩精品一区二区免费| 香蕉视频在线网址| 免费成人深夜夜行网站视频| 在线观看国产福利| 三级一区二区三区| 欧美 另类 交| 天堂在线中文在线| 日本熟妇人妻xxxx| 黄色一级片播放| 手机看片福利日韩| www.cao超碰| 国产精品人人爽人人爽| 美国av在线播放| 神马午夜伦理影院| 日韩在线视频在线观看| 青青草原国产在线视频| 91精品999| 国产一区亚洲二区三区| 天天天干夜夜夜操| 国产精品夜夜夜爽张柏芝| 国产亚洲精品网站| 中国女人做爰视频| 99久久激情视频| 精品免费久久久久久久| 牛夜精品久久久久久久| 无码播放一区二区三区| 久久久精品视频国产| 91av资源网| 女人被男人躁得好爽免费视频 | 樱空桃在线播放| 在线看的黄色网址| 午夜欧美福利视频| 日韩网站在线免费观看| 四虎永久免费网站| 欧美午夜aaaaaa免费视频| 亚洲 欧美 日韩系列| 波多野结衣家庭教师在线播放| 欧美性受xxxx黑人猛交88| 污视频网址在线观看| 国产a级一级片| xxxx一级片| 尤物网站在线看| 91xxx视频| 一级黄色录像免费看| 自拍偷拍视频在线| 一级黄色大片儿| 日本福利视频导航| 在线视频一二三区| 日本中文字幕网址| aaa毛片在线观看| 五月婷婷激情久久| 中文字幕成人免费视频| 4444亚洲人成无码网在线观看| 日本天堂免费a| 97在线免费公开视频| 成年人小视频网站| 欧美这里只有精品| 日韩精品一区二区三区色欲av| 久久久久国产精品熟女影院| 国产999免费视频| 91黄色小网站| 9191国产视频| 国产精品自拍片| 手机免费看av网站| 性欧美videossex精品| 国产小视频免费| 日韩欧美国产片| 91免费黄视频| 国产男女免费视频| 艳母动漫在线观看|