外观
策略模式
策略模式
定义算法簇,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的用户
- 策略的使用方和提供方之间,使用组合关系;各自内部,采用继承来做实现
- 针对接口(抽象类)进行编程,分离变与不变
- 由父类持有策略,此为不变/稳定的部分
- 由子类进行具体策略的初始化和注入,此为变的部分
设计原则
- 找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起
- 针对接口编程,而不是针对实现编程
- 多用组合,少用继承。
Have-amight be better thanIs-a
要点
- 良好的面向对象(OO)设计,必须具备可复用、可扩展、可维护三个特性。
- 模式是对历史经验的总结发现,而不是发明出来的
以鸭子项目为例,策略模式是如何满足以下三个设计原则的?
分离变与不变
- 不是所有的鸭子都会飞,无需为每一个鸭子写明独立的fly逻辑;
- 将“会飞”,“不会飞”,“背火箭飞”等具体的飞行策略与相对不变的鸭子模型分离开来,即是“变与不变分离”。
针对接口编程,而非针对实现编程
- 调用类: 利用语言的多态特性,使用父类声明指向子类策略引用;
- 策略类: 策略的不同实现,都继承于共同的父类(接口);
在两者的共同作用下,调用类使用策略时,仅需使用注入的策略类对象即可,无需关心内部实现细节,此即“针对接口编程”原则。
多用组合,少用继承
鸭子飞行的具体实现,通过注入外部定义的飞行策略实现,减少了继承体系所带来的继承灾难。
设计谜题-UML类图

Demo-UML类图

代码
https://gitee.com/lwx19960428/head-first-design-pattern/tree/master/strategy
版权所有
版权归属:Wanxiang Liu
