博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式-(17)策略模式 (swift版)
阅读量:5256 次
发布时间:2019-06-14

本文共 3508 字,大约阅读时间需要 11 分钟。

一,概念:

  策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。

 

二,使用场景

  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)    }}

 

转载于:https://www.cnblogs.com/yangzigege/p/8976055.html

你可能感兴趣的文章
在Ubuntu下配置Apache多域名服务器
查看>>
多线程《三》进程与线程的区别
查看>>
linux sed命令
查看>>
html标签的嵌套规则
查看>>
[Source] Machine Learning Gathering/Surveys
查看>>
HTML <select> 标签
查看>>
类加载机制
查看>>
tju 1782. The jackpot
查看>>
湖南多校对抗赛(2015.03.28) H SG Value
查看>>
hdu1255扫描线计算覆盖两次面积
查看>>
hdu1565 用搜索代替枚举找可能状态或者轮廓线解(较优),参考poj2411
查看>>
bzoj3224 splay板子
查看>>
程序存储问题
查看>>
Mac版OBS设置详解
查看>>
优雅地书写回调——Promise
查看>>
android主流开源库
查看>>
AX 2009 Grid控件下多选行
查看>>
PHP的配置
查看>>
Struts框架----进度1
查看>>
Round B APAC Test 2017
查看>>