【own】策略模式和狀態模式,都是提取動態行爲,解耦;if else 系列算法
策略模式:編程
在不肯定具體行爲,提取動態行爲,便於後期維護;因爲不肯定具體的行爲,因此行爲對象會不少,不利於對象維護;網站
使用場景:設計
假設如今要設計一個販賣各種書籍的電子商務網站的購物車系統。一個最簡單的狀況就是把全部貨品的單價乘上數量,可是實際狀況確定比這要複雜。好比,本網站可能對全部的高級會員提供每本20%的促銷折扣;對中級會員提供每本10%的促銷折扣;對初級會員沒有折扣。對象
根據描述,折扣是根據如下的幾個算法中的一個進行的:接口
算法一:對初級會員沒有折扣。登錄
算法二:對中級會員提供10%的促銷折扣。書籍
算法三:對高級會員提供20%的促銷折扣。引用
狀態模式:客戶端
肯定具體有幾個狀態,提取動態行爲,不一樣狀態有不一樣狀態;
使用場景:
考慮一個在線投票系統的應用,要實現控制同一個用戶只能投一票,若是一個用戶反覆投票,並且投票次數超過5次,則斷定爲惡意刷票,要取消該用戶投票的資格,固然同時也要取消他所投的票;若是一個用戶的投票次數超過8次,將進入黑名單,禁止再登陸和使用系統。
要使用狀態模式實現,首先須要把投票過程的各類狀態定義出來,根據以上描述大體分爲四種狀態:正常投票、反覆投票、惡意刷票、進入黑名單。而後建立一個投票管理對象(至關於Context)。
狀態模式與策略模式涉及到的角色:
● 環境(Context)角色【用於組裝對象】:持有一個Strategy的引用。
● 抽象策略(Strategy)角色【面向抽象編程】:這是一個抽象角色,一般由一個接口或抽象類實現。此角色給出全部的具體策略類所需的接口。
● 具體策略(ConcreteStrategy)角色【根據客戶端選擇】:包裝了相關的算法或行爲。