策略模式
基本介绍:
- 策略模式中,定义算法族,分别封装起来,让他们之间可以相互替换,此模式算法的变化独立于使用算法的用户
- 策略模式体现了几个设计原则:第一、把变化的代码从不变得代码中分离出来;第二、针对接口编程而不是具体类(定义了策略接口);第三、多用组合或聚合少用继承(客户使用组合方式使用策略)
原理类图:
案例:
策略模式实现各种鸭子的飞翔能力
public interface Fly {
void fly();
}
public class NoFly implements Fly {
@Override
public void fly() {
System.out.println("不会飞翔");
}
}
public class GoodFly implements Fly {
@Override
public void fly() {
System.out.println("good fly技术");
}
}
public class BadFly implements Fly {
@Override
public void fly() {
System.out.println("飞翔能力不好。。");
}
}
public abstract class Duck {
protected Fly fly;
public Duck() {
}
protected abstract void display();
protected void fly(){
if(fly != null){
fly.fly();
}
}
}
public class PekingDuck extends Duck {
public PekingDuck() {
fly = new BadFly();
}
@Override
protected void display() {
System.out.println("北京鸭");
}
}
public class WildDuck extends Duck {
public WildDuck() {
fly = new GoodFly();
}
@Override
protected void display() {
System.out.println("野鸭");
}
}
public class ToyDuck extends Duck {
public ToyDuck() {
fly = new NoFly();
}
@Override
protected void display() {
System.out.println("玩具鸭");
}
}
public class Client {
public static void main(String[] args) {
final WildDuck wildDuck = new WildDuck();
wildDuck.display();
wildDuck.fly();
final PekingDuck pekingDuck = new PekingDuck();
pekingDuck.display();
pekingDuck.fly();
final ToyDuck toyDuck = new ToyDuck();
toyDuck.display();
toyDuck.fly();
}
}
策略模式在JDK-Arrays中的使用:
- Arrays中的comparator就使用到了策略接口,通过对接口的不同的实现完成对array的降序或升序排序
策略模式注意事项和细节:
- 策略模式的关键是:分析项目中变化部分和不变部分
- 策略模式的核心思想是:多用组合、聚合,少用继承;用行为类组合,而不是行为继承,更具弹性
- 体现了“对修改关闭,对扩展开发”原则,客户端增加行为不用修改源代码,只要添加一种策略或者行为即可,避免使用多重转移语句(if…else if…else)
- 提供了可以替换继承关系的方法:策略模式将算法封装在独立的strategy类中,使得你可以独立于其Context改变他,使它易于切换、易于理解、易于扩展
- 需要注意的是:没添加一个策略就要增加一个类,当策略过多时会导致类数目庞大