策略模式

行为类设计模式

简要定义

定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化

要点

  • 策略模式是对算法的封装, 他把算法的责任和算法本身分割开,为派给不同的对象管理.
  • 在策略模式中, 具体使用某种策略应该由客户端来决定

类图

策略模式_第1张图片
Strategy Mode.png
  • Context类: 需要使用策略的类, 它持有一个Strategy的引用
  • Strategy类: 定义策略类的接口
  • Concrete类: 继承自Strategy, 具体实现相关策略算法

具体实现

有一家卖书的网站想做一套结算系统,其中的一部分就是计算书的价格,这家网站上的书基本上都有优惠,而且不同种类的书优惠不同,比如漫画书打9折,小说打6折等等
[参考]https://blog.csdn.net/xingjiarong(https://blog.csdn.net/xingjiarong/article/details/50168853)

//即类图中的Context类
public abstract class Book {

    //原价
    protected double basePrice = 0.0;
    //持有策略
    protected Strategy strategy;

    public Book(double basePrice){
        this.basePrice = basePrice;
    }

    /**
     * 设置策略
     * @param strategy
     */
    public void setStrategy(Strategy strategy){
        this.strategy = strategy;
    }

    /**
     * 利用策略的统一接口实现获取书的应付价格
     * @return
     */
    public double getPrice(){
        return strategy.getDiscount(basePrice);
    }

    /**
     * 抽象的展示方法,每类书都有自己的实现方式
     */
    public abstract void show();

}
抽象策略类
public abstract class Strategy {
    public abstract double getDiscount(double basePrice);
}
//具体策略类
public class NovelStrategy extends Strategy{

    public double getDiscount(double basePrice) {
        return 0.6*basePrice;
    }

}
//测试类
public class Client {

    public static void main(String[] args) {
        Book book = new Comic(12.3);
        Strategy strategy = new ComicStrategy();
        //设置采用何种策略
        book.setStrategy(strategy);
        book.getPrice();
        book.show();
    }

}

优缺点

优点

策略模式将行为封装在一个个独立的Strategy类中, 这样做有如下好处

  • 避免了大量的if--else 判断语句
  • 使行为独立于Context类, 更加易于切换, 易于修改, 易于拓展
缺点
  • 客户端必须知道所有的策略类. 当客户选择使用一个合适的策略时, 就必须知道这些Strategy之前的区别, 此时可能必须要向客户暴露具体的实现
  • 策略模式会产生大量的策略类(可以使用享元模式进行优化).

使用场景

  • 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为.
  • 一个系统需要动态地在几种算法中选择一种
具体应用
  • 游戏状态机
  • 游戏中武器的选择
  • 打折

你可能感兴趣的:(策略模式)