策略模式

定义:定义了算法族,分别封装起来,使它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。

  • 算法族:使用多种不同的方式处理同一件事情。这些处理方式构成算法族。
  • 算法族实现同一个策略接口,客户端在运行时选择使用哪个算法,算法之间可以互相替换,可以说客户端是依赖接口而非实际行为。

使用场景

  • 同一问题有多种不同处理方式或者表现形式时。

UML图

策略模式策略模式

  • Context使用策略的类:持有Strategy的引用。
  • Strategy抽象的策略接口:通常为一个接口或者抽象类。
  • ConcreteStrategy具体的策略类:对Strategy的实现,包含具体算法。

代码示例

public class Duck {
    QuackBehavior quackBehavior;
    public Duck(QuackBehavior quackBehavior){
        this.quackBehavior = quackBehavior;
    }
    public void doQuack(){
        quackBehavior.Quack();
    }
}
public interface QuackBehavior {
    void Quack();
}
public class QuackBehaviorA implements QuackBehavior {
    @Override
    public void Quack() {
        System.out.println("Quack AAA");
    }
}
public class QuackBehaviorB implements QuackBehavior {
    @Override
    public void Quack() {
        System.out.println("Quack BBB");
    }
}

测试

public class StrategyTestDemo {
    public static void main(String[] args){
        Duck duck = new Duck(new QuackBehaviorA());
        duck.doQuack();
        duck = new Duck(new QuackBehaviorB());
        duck.doQuack();
    }
}

运行结果

策略模式

优点:算法可以切换,*度高

缺点:所有策略类都需要暴露给使用者,行为较多时可能会产生过多的策略类

思考

  • 对会员等级的不同特权等场景可能适用。
  • 当行为过多时,可能需要搭配其他设计模式处理类膨胀的问题。
上一篇:Head First 设计模式笔记 1.策略模式


下一篇:SQL 同比环比