一、 设计模式
软件设计中总结出来的针对于某类问题的通用解决方案;
二、策略模式
1、需求:鸭子都有发出叫声和会游泳的特性,不同的鸭子有不同的显示
设计实现:
父类:Duck
子类:RedHeadDuck、GreenHeadDuck
共有的特性在父类中实现;
public void swim(){//添加实现}
public void quack(){//添加实现}
public abstract void display();//在父类中定义
独有的特性子类中实现;
public abstract void display();//在子类中针对各自特征实现
2、新需求:添加会飞的鸭子
2.1 解决办法:在超类中添加会飞的特性 public void fly(){//具体实现}
存在问题:有的鸭子没有飞的特性
分析原因:父类的修改会影响子类的修改
2.2 解决办法1:在不会飞的鸭子类中添加不会飞特性覆盖父类的方法;
问题:如果大量的鸭子类别,意味着父类的修改会影响很多子类的修改,存在大量重复的工作;
解决办法2:父类抽象,由子类实现(代码复用性低)
2.3 解决办法:使用策略模式实现
3、策略模式的实现
需要新的设计方式,应对项目的扩展性,降低复杂度:
1)分析项目变化与不变的部分,提取变化部分,抽象成接口+实现;
2)鸭子的哪些功能时根据需求变化的?叫声,飞行
针对特性定义接口类:
public interface FlyBehavior(){
void fly();
}
//在HightFly、LowFly类中分别实现;
public interface QuackBehavior(){
void quack();
}
//在PleasantQuack、ScrannelQuack类中分别实现;
行为的初始化:
在Duck类中声明;
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
在子类中创建对象赋予其特定的特性:
public GreenHeadDuck() {
flyBehavior = new LowFly();
quackBehavior = new ScrannelQuack();
}
设计优点:新增行为简单,更好的功能复用
4、类的详细设计
com.strategy.domain
Duck
RedHeadDuck
GreenHeadDuck
StoneDuck
com.strategy.fly.behavior
FlyBehavior
LowFly
HightFly
com.strategy.quack.behavior
QuackBehavior
PleasantQuack
ScrannelQuack
com.strategy.run
DuckTest
5、策略模式的思想
封装变化动作为接口,定义行为族,超类中只是存放行为接口对象,子类中创建的时
候设定行为对象(生成对应特性的对象,从而得到该特性对象的实现);
**实现细节:**
1)分离变化部分,封装接口,基于接口编程;
2)使用面向对象编程,多用组合少用继承(降低算法的复杂度及耦合度)
6、代码的实现:
https://github.com/vagrant-angel/design-pattern/tree/pattern/strategy-pattern