定义:定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的用户。
类型行为型
适用场景

  • 系统有很多类,而它们的区别仅仅在于它们的行为不同
  • 一个系统需要动态地在几种算法中选择一种

优点

  • 开闭原则
  • 避免使用多重条件转移语句(if...else...,switch)
  • 提高算法的保密性和安全性

缺点:

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

案例

某知识平台的教学视频促销(满减、立减、返现)

促销策略接口

public interface PromotionStrategy {    void doPromotion();}

返现策略

public class FanXianPromotionStrategy implements PromotionStrategy{    @Override    public void doPromotion() {        System.out.println("返现促销,返回的金额存放到慕课网用户的余额中");    }}

立减策略

public class LiJianPromotionStrategy implements PromotionStrategy {    @Override    public void doPromotion() {        System.out.println("立减促销,课程的价格直接减去配置的价格");    }}

满减策略

public class ManJianPromotionStrategy implements PromotionStrategy{    @Override    public void doPromotion() {        System.out.println("满减促销,满200-20元");    }}

促销活动

public class PromotionActivity {    private PromotionStrategy promotionStrategy;    public PromotionActivity(PromotionStrategy promotionStrategy) {        this.promotionStrategy = promotionStrategy;    }    public void executePromotionStrategy(){        promotionStrategy.doPromotion();    }}
public class Test {    public static void main(String[] args) {        PromotionActivity promotionActivity618 = new PromotionActivity(new LiJianPromotionStrategy());        PromotionActivity promotionActivity1111 = new PromotionActivity(new FanXianPromotionStrategy());        promotionActivity618.executePromotionStrategy();        promotionActivity1111.executePromotionStrategy();    }}

结果: