美文网首页
策略模式(Strategy Pattern)

策略模式(Strategy Pattern)

作者: 东南枝下 | 来源:发表于2021-02-28 23:33 被阅读0次

策略模式(Strategy Pattern)

定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。

其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换,使得算法可以在不影响到客户端的情况下发生变化。

图片.png

三个角色:

  • 抽象策略(Strategy)角色:该角色对策略、算法进行抽象,通常定义每个策略或算法必须具有的方法和属性。
/**
 * 抽象策略角色
 *
 * @author Jenson
 */
@Data
public abstract class DiscountStrategy {
    /**
     * 书的价格
     */
    private double price = 0;
    /**
     * 书的数量
     */
    private int number = 0;

    public DiscountStrategy(double price, int number) {
        this.price = price;
        this.number = number;
    }

    /**
     * 策略方法--计算折扣
     *
     * @return 折扣
     */
    public abstract double calculateDiscount();
}

  • 具体策略(Concrete Strategy)角色:该角色实现抽象策略中的具体操作,含有具体的算法
public class FixDiscountStrategy extends DiscountStrategy {
    public FixDiscountStrategy(double price, int number) {
        super(price, number);
    }

    @Override
    public double calculateDiscount() {
        return getNumber() * 1;
    }
}
  • 环境(Context)角色:该角色也叫上下文角色,起到承上启下的作用,屏蔽高层模块对策略、算法的直接访问,它持有一个Strategy类的引用。
/**
 * 环境角色
 *
 * @author Jenson
 */
public class Context {
    private DiscountStrategy ds;

    public Context(DiscountStrategy ds) {
        this.ds = ds;
    }

    public double contextCalDisc() {
        return ds.calculateDiscount();
    }
}

调用

/**
 * @author Jenson
 */
public class StrategyMain {

    public static void main(String[] args) {
        Context context = new Context(new FixDiscountStrategy(40, 60));

        System.out.println("折扣为:" + context.contextCalDisc());
    }
}

缺点:

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
  • 策略模式造成很多的策略类。

相关文章

网友评论

      本文标题:策略模式(Strategy Pattern)

      本文链接:https://www.haomeiwen.com/subject/hnqofltx.html