Swift设计模式之责任链模式

前端之家收集整理的这篇文章主要介绍了Swift设计模式之责任链模式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

转自

原文

  1. // 责任链模式
  2. // 百度百科:在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
  3. // 设计模式分类:行为型模式
  4.  
  5. /// 钱堆
  6. class MoneyPile {
  7. /// 价值
  8. let value: Int
  9. /// 数量
  10. var quantity: Int
  11. /// 下一堆
  12. var nextPile: MoneyPile?
  13.  
  14. /** 初始化 - parameter value: 价值 - parameter quantity: 数量 - parameter nextPile: 下一堆 - returns: 堆对象 */
  15. init(value: Int,quantity: Int,nextPile: MoneyPile?) {
  16. self.value = value
  17. self.quantity = quantity
  18. self.nextPile = nextPile
  19. }
  20.  
  21. /** 判断是否可以提取 - parameter value: 提取值 - returns: true 可以, false 不行 */
  22. func canWithdraw(value: Int) -> Bool {
  23.  
  24. var v = value
  25.  
  26. func canTakeSomeBill(want: Int) -> Bool {
  27. return (want / self.value) > 0
  28. }
  29.  
  30. var q = self.quantity
  31.  
  32. while canTakeSomeBill(v) {
  33.  
  34. if q == 0 {
  35. break
  36. }
  37.  
  38. v -= self.value
  39. q -= 1
  40. }
  41.  
  42. if v == 0 {
  43. return true
  44. } else if let next = self.nextPile {
  45. return next.canWithdraw(v)
  46. }
  47.  
  48. return false
  49. }
  50. }
  51.  
  52. /// ATM取款机
  53. class ATM {
  54. /// 100元堆
  55. private var hundred: MoneyPile
  56. /// 50元堆
  57. private var fifty: MoneyPile
  58. /// 20元堆
  59. private var twenty: MoneyPile
  60. /// 10元堆
  61. private var ten: MoneyPile
  62.  
  63. private var startPile: MoneyPile {
  64. return self.hundred
  65. }
  66.  
  67. /** 初始化 - parameter hundred: 100元堆 - parameter fifty: 50元堆 - parameter twenty: 20元堆 - parameter ten: 10元堆 - returns: atm对象 */
  68. init(hundred: MoneyPile,fifty: MoneyPile,twenty: MoneyPile,ten: MoneyPile) {
  69.  
  70. self.hundred = hundred
  71. self.fifty = fifty
  72. self.twenty = twenty
  73. self.ten = ten
  74. }
  75.  
  76. /** 判断是否可以提取 - parameter value: 提取值 - returns: true 可以, false 不行 */
  77. func canWithdraw(value: Int) -> String {
  78. return "Can withdraw: \(self.startPile.canWithdraw(value))"
  79. }
  80. }
  81.  
  82. // 创建一些钱堆, 并将它们链接在一起
  83. let ten = MoneyPile(value: 10,quantity: 6,nextPile: nil)
  84. let twenty = MoneyPile(value: 20,quantity: 2,nextPile: ten)
  85. let fifty = MoneyPile(value: 50,nextPile: twenty)
  86. let hundred = MoneyPile(value: 100,quantity: 1,nextPile: fifty)
  87.  
  88. // 创建atm对象
  89. var atm = ATM(hundred: hundred,fifty: fifty,twenty: twenty,ten: ten)
  90.  
  91. atm.canWithdraw(310) // false atm只有300
  92. atm.canWithdraw(100) // true 100*1
  93. atm.canWithdraw(165) // false atm没有面值5
  94. atm.canWithdraw(30) // true 20*1 + 10*1

猜你在找的Swift相关文章