意图/目的/定义(intent)

(简短的描述该模式的作用。)
策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

动机(motivation)

(动机给出来问题以及如何解决这个问题的具体场景。)

适用性(applicability)

(适用性描述模式可以被应用在什么场合。)

结构(structure)

(结构提供了图示,显示出参与此模式的类之间的关系。)

参与者(participants)

(参与者描述在此设计中所涉及到的类和对象在模式中的责任和角色。)

协作(collaborations)

(协作告诉我们参与者如何在此模式中合作。)

实现/范例代码(implementation/sample code)

(实现提供了你在实现该模式时需要使用的技巧,以及你应该小心面对的问题。)
(范例代码提供代码的片段,可能对你的实现有多帮助。)
模拟鸭子类型实现代码

  1. /// 飞行行为超类
  2. abstract class FlyBehavior {
  3. void fly();
  4. }
  5. // 翅膀飞行
  6. class FlyWithWings extends FlyBehavior {
  7. void fly() {
  8. print('使用翅膀飞行');
  9. }
  10. }
  11. /// 不会飞行
  12. class FlyNoWay extends FlyBehavior {
  13. void fly() {
  14. print('不会飞');
  15. }
  16. }
  17. /// 叫声行为类
  18. abstract class QuackBehavior {
  19. void quack();
  20. }
  21. /// 呱呱叫
  22. class Quack extends QuackBehavior {
  23. void quack() {
  24. print('呱呱叫');
  25. }
  26. }
  27. /// 吱吱叫
  28. class Squeak extends QuackBehavior {
  29. void quack() {
  30. print('吱吱叫');
  31. }
  32. }
  33. /// 不会叫
  34. class MuteQuack extends QuackBehavior {
  35. void quack() {
  36. print('不会叫');
  37. }
  38. }
  39. /// 鸭子类
  40. abstract class Duck {
  41. FlyBehavior flyBehavior;
  42. QuackBehavior quackBehavior;
  43. // 构造函数
  44. Duck(this.flyBehavior, this.quackBehavior);
  45. // Duck(fb, qb) {
  46. // this.flyBehavior = fb;
  47. // this.quackBehavior = qb;
  48. // }
  49. // 外观
  50. void display();
  51. // 飞行
  52. void performFly() {
  53. flyBehavior.fly();
  54. }
  55. // 叫声
  56. void performQuack() {
  57. quackBehavior.quack();
  58. }
  59. void setFly(FlyBehavior fb) {
  60. this.flyBehavior = fb;
  61. }
  62. void setQuack(QuackBehavior qb) {
  63. this.quackBehavior = qb;
  64. }
  65. // 游泳
  66. void swim() {
  67. print('游泳');
  68. }
  69. }
  70. /// 野鸭
  71. class MallardDuck extends Duck {
  72. MallardDuck()
  73. : super(
  74. new FlyWithWings(),
  75. new Quack(),
  76. );
  77. @override
  78. void display() {
  79. print('我是野鸭');
  80. }
  81. }
  82. /// 红头鸭
  83. class RedheadDuck extends Duck {
  84. RedheadDuck()
  85. : super(
  86. new FlyWithWings(),
  87. new Quack(),
  88. );
  89. @override
  90. void display() {
  91. print('红头鸭');
  92. }
  93. }
  94. /// 橡皮鸭
  95. class RubberDuck extends Duck {
  96. RubberDuck()
  97. : super(
  98. new FlyNoWay(),
  99. new Squeak(),
  100. );
  101. @override
  102. void display() {
  103. print('橡皮鸭');
  104. }
  105. }
  106. /// 测试
  107. void main() {
  108. MallardDuck mallardDuck = new MallardDuck();
  109. RedheadDuck redheadDuck = new RedheadDuck();
  110. RubberDuck rubberDuck = new RubberDuck();
  111. mallardDuck.display();
  112. mallardDuck.swim();
  113. mallardDuck.performFly();
  114. mallardDuck.performQuack();
  115. print('\n');
  116. redheadDuck.display();
  117. redheadDuck.swim();
  118. redheadDuck.performFly();
  119. redheadDuck.performQuack();
  120. print('\n');
  121. rubberDuck.display();
  122. rubberDuck.swim();
  123. rubberDuck.performFly();
  124. rubberDuck.performQuack();
  125. print('\n');
  126. // 动态设置鸭子行为
  127. print('动态设置鸭子行为后:');
  128. mallardDuck.setFly(new FlyNoWay());
  129. mallardDuck.setQuack(new MuteQuack());
  130. mallardDuck.display();
  131. mallardDuck.swim();
  132. mallardDuck.performFly();
  133. mallardDuck.performQuack();
  134. }

已知应用(known uses)

(已知应用用来描述已经在真实系统中发现的模式例子。)

相关模式(related patterns)

(相关模式描述了此模式和其他模式之间的关系。)

OO知识

OO基础

  1. 抽象
  2. 封装
  3. 多态
  4. 继承

OO原则

  1. 封装变化
  2. 多用组合少用继承
  3. 针对接口编程,不针对实现编程

    要点

  4. 知道OO基础,并不足以让你设计出良好的OO系统。

  5. 良好的OO设计必须具备可复用、可扩展、可维护三个特性。
  6. 模式可以让我们建造出具有良好OO设计质量的系统。
  7. 模式被认为是历经验证的OO设计经验。
  8. 模式不是代码,而是针对设计问题的通用解决方案。你可以把他们应用到特定的应用中。
  9. 模式不是被发明,而是被发现。
  10. 大多数的模式和原则,都着眼于软件变化的主题。
  11. 大多数的模式都允许系统局部改变独立于其他部分。
  12. 我们常把系统中会变化的部分抽出来封装。
  13. 模式让开发人员之间有共享的语言,能够最大化沟通的价值。