1.概念、用处和意义
设计模式是人们面对同类型软件工程设计问题所总结出来的一些有用经验,设计模式不是代码,而是某类问题的通用解决方案
OO面向对象是原则,设计模式是在基础上的具体方法或工具
设计模式的本质目的是使软件工程在维护性、扩展性、变化性、复杂度方面成O(N)
2.策略模式原理
模拟鸭子项目:功能(鸭子都会嘎嘎叫、会游泳、颜色不一样),子类继承父类 实现
项目的新需求:添加新功能(有些鸭子会飞),不是所有子类都有该功能
继承的问题,对类的局部改动,尤其超类的局部改动,会影响其他部分(有些子类不需要这种功能)。影响会有溢出效应
用OO解决新需求的不足(把功能放在子类里面),代码复用性降低,覆盖
超类里面挖的一个坑,每个子类都要来填,增加工作量,复杂度O(N2)。不是好的设计方式
用策略模式解决新需求:
需要新的设计方式,应对项目的扩展性,降低复杂度
分析项目变化部分与不变化部分,提取变化部分,抽象成接口+实现;
哪些功能是根据新需求变化的;
重新设计模拟鸭子项目:
1.接口 interface FlyBehavior, Fly生成相应的行为组class NoFlyBehavior/Fast implements FlyBehavior
接口 interface QuackBehavior....
好处:新增行为简单,行为类更好的复用,组合更方便。基友继承带来的复用好处,没有挖坑
2. 父类abstract class Duck{
FlyBehavior flyBehavior;
QuackBevior quackBehavior;
public Duck(){}
public void Fly(){flyBehavior.Fly();}
public void setFly(FlyBehavior f){动态设置行为}
public void Quack(){quackBehavior.Quack();}
public void setQuack(QuackBevior q){动态设置行为}
public abstract void display();
}
3.子类class GreenDuck extends Duck{
public GreenDuck(){
flyBehavior=new FastFlyBehavior();
....
}
@Override
public void display(){}
}
策略模式:分别封装行为接口,实现算法族,超类里放行为接口对象,在子类里具体设定行为对象。原则就是,分离变化部分,封装接口,基于接口编程各种功能。此模式让行为算法的变化独立于使用者。
分析项目中变化部分和不变化部分(当前项目中变化的,还要考虑以后新增加功能可能要变化的)
多用组合少用继承;用行为类组合,而不是行为的继承。更有弹性(相同行为可以替换,不同行为相互独立)
策略模式是由经验总结而来,没有相应的代码模板、库和框架来支持
找不到合适的模式解决问题,可能分析问题不透彻,还可能遇到的问题特殊,只能使用面向对象的基本原则,分析