設計模式-(17)策略模式 (swift版)
阿新 • • 發佈:2018-05-01
clas PC ring override 角色 var 有一個 包裝 封裝
一,概念:
策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使他們可以相互替換,讓算法獨立於使用它的客戶而獨立變化。
二,使用場景
1.針對同一類型問題的多種處理方式,僅僅是具體行為有差別時;
2.需要安全地封裝多種同一類型的操作時;
3.出現同一抽象類有多個子類,而又需要使用 if-else 或者 switch-case 來選擇具體子類時。
三,類圖
環境(Context)角色:持有一個Strategy的引用。
抽象策略(Strategy)角色:這是一個抽象角色,通常由一個接口或抽象類實現。此角色給出所有的具體策略類所需的接口。
具體策略(ConcreteStrategy)角色:包裝了相關的算法或行為。
四,代碼實例
protocol CardInterface { var money: Float{get set} var discountShopping: Float{get} var discountFood: Float{get} var discountRecreation: Float{get} func shopping(standardCost: Float) -> Bool func food(standardCost: Float) -> Bool func recreation(standardCost: Float) -> Bool } class BaseCard: CardInterface { var money: Float var discountShopping: Float var discountFood: Float var discountRecreation: Float init(money: Float, dShopping: Float, dFood: Float, dRecreation: Float) { self.money = money discountShopping = dShopping discountFood = dFood discountRecreation = dRecreation } func shopping(standardCost: Float) -> Bool { if money >= standardCost * discountShopping { money -= standardCost * discountShopping print("success: price(\(standardCost)), cost (\(standardCost * discountShopping)) in fact,left (\(money)),type shopping") return true } print("Lack of balance") return false } func food(standardCost: Float) -> Bool { if money >= standardCost * discountFood { money -= standardCost * discountFood print("success: price(\(standardCost)), cost (\(standardCost * discountFood)) in fact,left (\(money)),type food") return true } print("Lack of balance") return false } func recreation(standardCost: Float) -> Bool { if money >= standardCost * discountRecreation { money -= standardCost * discountRecreation print("success: price(\(standardCost)), cost (\(standardCost * discountRecreation)) in fact,left (\(money)),type recreation") return true } print("Lack of balance") return false } } class NomalCard: BaseCard { init(money: Float) { super.init(money: money, dShopping: 0.88, dFood: 0.9, dRecreation: 0.8) } } class VipCard: BaseCard { init(money: Float) { super.init(money: money, dShopping: 0.8, dFood: 0.8, dRecreation: 0.7) } } class SuperVipCard: BaseCard { init(money: Float) { super.init(money: money, dShopping: 0.7, dFood: 0.75, dRecreation: 0.5) } }
enum CardType: String { case Nomal case VIP case SuperVIP } class Customer { var card: CardInterface? var cardType: CardType init(cType: CardType) { cardType = cType addCard() } fileprivate func addCard() { switch cardType { case .Nomal: card = NomalCard(money: 100) case .VIP: card = VipCard(money: 100) case .SuperVIP: card = SuperVipCard(money: 100) default: break } } }
class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let xiaoMing = Customer(cType: .SuperVIP) var rel = xiaoMing.card?.recreation(standardCost: 88) print(rel ?? false) rel = xiaoMing.card?.recreation(standardCost: 100) print(rel ?? false) rel = xiaoMing.card?.recreation(standardCost: 100) print(rel ?? false) } }
設計模式-(17)策略模式 (swift版)