美文网首页
责任链模式

责任链模式

作者: 863cda997e42 | 来源:发表于2017-09-26 10:03 被阅读20次

    example

    final class MoneyPile {
    
        let value: Int
        var quantity: Int
        var nextPile: MoneyPile?
    
        init(value: Int, quantity: Int, nextPile: MoneyPile?) {
            self.value = value
            self.quantity = quantity
            self.nextPile = nextPile
        }
    
        func canWithdraw(amount: Int) -> Bool {
    
            var amount = amount
    
            func canTakeSomeBill(want: Int) -> Bool {
                return (want / self.value) > 0
            }
    
            var quantity = self.quantity
    
            while canTakeSomeBill(want: amount) {
    
                if quantity == 0 {
                    break
                }
    
                amount -= self.value
                quantity -= 1
            }
    
            guard amount > 0 else {
                return true
            }
    
            if let next = self.nextPile {
                return next.canWithdraw(amount: amount)
            }
    
            return false
        }
    }
    
    final class ATM {
        private var hundred: MoneyPile
        private var fifty: MoneyPile
        private var twenty: MoneyPile
        private var ten: MoneyPile
    
        private var startPile: MoneyPile {
            return self.hundred
        }
    
        init(hundred: MoneyPile,
               fifty: MoneyPile,
              twenty: MoneyPile,
                 ten: MoneyPile) {
    
            self.hundred = hundred
            self.fifty = fifty
            self.twenty = twenty
            self.ten = ten
        }
    
        func canWithdraw(amount: Int) -> String {
            return "Can withdraw: \(self.startPile.canWithdraw(amount: amount))"
        }
    }
    /*:
    ### Usage
    */
    // Create piles of money and link them together 10 < 20 < 50 < 100.**
    let ten = MoneyPile(value: 10, quantity: 6, nextPile: nil)
    let twenty = MoneyPile(value: 20, quantity: 2, nextPile: ten)
    let fifty = MoneyPile(value: 50, quantity: 2, nextPile: twenty)
    let hundred = MoneyPile(value: 100, quantity: 1, nextPile: fifty)
    
    // Build ATM.
    var atm = ATM(hundred: hundred, fifty: fifty, twenty: twenty, ten: ten)
    atm.canWithdraw(amount: 310) // Cannot because ATM has only 300
    atm.canWithdraw(amount: 100) // Can withdraw - 1x100
    atm.canWithdraw(amount: 165) // Cannot withdraw because ATM doesn't has bill with value of 5
    atm.canWithdraw(amount: 30)  // Can withdraw - 1x20, 2x10
    
    
    

    相关文章

      网友评论

          本文标题:责任链模式

          本文链接:https://www.haomeiwen.com/subject/mjtsextx.html