策略模式(Strategy Pattern)

一.策略模式定义

1.Context封装角色

它也叫上下文,起承上启下的封装作用,屏蔽高层模块对策略、算法的直接访问,封装肯存在变化。

2.Strategy抽象策略角色

策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。

3.ConcreteStrategy具体策略角色

实现抽象策略中的操作,改了包含具体的实现等算法或业务特色。

二. 示例

1.抽象的策略角色
java 复制代码
/**
 * 抽象策略角色
 */
public interface Strategy {
    /**
     * 策略模式算法或者业务特色的控制
     */
    void dosomething();

}
2.具体策略角色
java 复制代码
public class ConcreteStrateg1 implements Strategy{
    @Override
    public void dosomething() {
        //TODO 实现策略或者具体的业务逻辑
    }
}

public class ConcreteStrateg2 implements Strategy{
    @Override
    public void dosomething() {
        //TODO 实现策略或者具体的业务逻辑
    }
}
3.封装角色
java 复制代码
/**
 * 封装角色
 */
public class Context {
    
    private Strategy strategy = null;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    
    public void doAnything() {
        this.strategy.dosomething();
    }
}
4.高层模块使用
java 复制代码
public class Client {

    public static void main(String[] args) {
        //声明一个具体的策略
        Strategy strategy = new ConcreteStrateg1();
        //声明上下文
        Context context = new Context(strategy);
        //执行封装后的方法
    }
}

三.应用场景

1.电商平台购物车渲染
(1)定义购物车渲染枚举
java 复制代码
/**
 * 购物车渲染枚举
 */
public enum RenderStepEnums {

    /**
     * 购物车渲染枚举
     */
    CHECK_DATA("校验商品"),
    CHECKED_FILTER("选择商品过滤"),
    COUPON("优惠券价格渲染"),
    SKU_PROMOTION("商品促销计算"),
    FULL_DISCOUNT("满减计算"),
    SKU_FREIGHT("运费计算"),
    DISTRIBUTION("分配需要分配的促销金额"),
    PLATFORM_COMMISSION("平台佣金"),
    CART_PRICE("购物车金额计算"),
    CART_SN("交易编号创建");

    private String distribution;

    public String getDistribution() {
        return distribution;
    }

    RenderStepEnums(String distribution) {
        this.distribution = distribution;
    }
}
(2)抽象购物车渲染步骤策略
java 复制代码
/**
 * 购物车渲染
 */
public interface CartRenderStep {

    /**
     * 渲染价格步骤
     *
     * @return 渲染枚举
     */
    RenderStepEnums step();

    /**
     * 渲染一笔交易
     *
     * @param tradeDTO 交易DTO
     */
    void render(Object tradeDTO);

}
(3)实现购物车渲染的业务逻辑
java 复制代码
/**
 * 购物车渲染,将购物车中的各个商品,拆分到每个商家,形成购物车VO
 */
public class CartPriceRender implements CartRenderStep {
    @Override
    public RenderStepEnums step() {
        return RenderStepEnums.CART_PRICE;
    }

    @Override
    public void render(Object tradeDTO) {
        //TODO 计算商品价格等
    }
}
java 复制代码
/**
 * 交易流水号生成
 */
public class CartSnRender implements CartRenderStep {
    @Override
    public RenderStepEnums step() {
        return RenderStepEnums.CART_SN;
    }

    @Override
    public void render(Object tradeDTO) {
        //生成流水号等等
    }
}
java 复制代码
/**
 * sku 运费计算
 *
 */
public class SkuFreightRender implements CartRenderStep {

    @Override
    public RenderStepEnums step() {
        return RenderStepEnums.SKU_FREIGHT;
    }

    @Override
    public void render(TradeDTO tradeDTO) {
        //收货地址问题处理、校验等
        //运费模板选择等
        //选择物流的时候计算价格
        
    }
}
(4)封装购物车渲染策略
java 复制代码
public class RenderStepContext {

    /**
     * spring的直接注入列表就可以了,其他的通过构造函数等方式初始化策略
     * 购物车渲染步骤
     */
    //@Autowired
    private List<CartRenderStep> cartRenderSteps;
    
	public RenderStepContext() {
    }

    public RenderStepContext(List<CartRenderStep> cartRenderSteps) {
        this.cartRenderSteps = cartRenderSteps;
    }

    public void renderCartBySteps(Object dto, RenderStepEnums[] renderSteps) {
        for (RenderStepEnums step : renderSteps) {
            for (CartRenderStep render : cartRenderSteps) {
                try {
                	if (render.step().equals(step)) {
                        render.render(dto);
                    }
                } catch (Exception e) {
                    throw e;
                }
            }
        }
    }
}
(5)根据业务场景选择策略
java 复制代码
/**
 * 购物车渲染 步骤声明
 *
 */
public class RenderStepStatement {

	/**
     * 测试
     */
    public static RenderStepEnums[] test = {
      RenderStepEnums.CART_PRICE,
      RenderStepEnums.CART_SN
    };

    /**
     * 购物车购物车渲染
     * 校验商品 》 满优惠渲染  》  渲染优惠  》计算价格
     */
    public static RenderStepEnums[] cartRender = {
            RenderStepEnums.CHECK_DATA,
            RenderStepEnums.SKU_PROMOTION,
            RenderStepEnums.FULL_DISCOUNT,
            RenderStepEnums.CART_PRICE};

    /**
     * 结算页渲染
     * 过滤选择的商品 》 校验商品 》 满优惠渲染  》  渲染优惠  》
     * 优惠券渲染  》 计算运费  》  计算价格
     */
    public static RenderStepEnums[] checkedRender = {
            RenderStepEnums.CHECKED_FILTER,
            RenderStepEnums.CHECK_DATA,
            RenderStepEnums.SKU_PROMOTION,
            RenderStepEnums.FULL_DISCOUNT,
            RenderStepEnums.COUPON,
            RenderStepEnums.SKU_FREIGHT,
            RenderStepEnums.CART_PRICE,
    };


    /**
     * 单个商品优惠,不需要渲染满减优惠
     * 用于特殊场景:例如积分商品,拼团商品,虚拟商品等等
     */
    public static RenderStepEnums[] checkedSingleRender = {
            RenderStepEnums.CHECK_DATA,
            RenderStepEnums.SKU_PROMOTION,
            RenderStepEnums.COUPON,
            RenderStepEnums.SKU_FREIGHT,
            RenderStepEnums.CART_PRICE
    };

    /**
     * 交易创建前渲染
     * 渲染购物车 生成SN 》分销人员佣金渲染 》平台佣金渲染
     */
    public static RenderStepEnums[] singleTradeRender = {
            RenderStepEnums.CHECK_DATA,
            RenderStepEnums.SKU_PROMOTION,
            RenderStepEnums.SKU_FREIGHT,
            RenderStepEnums.CART_PRICE,
            RenderStepEnums.CART_SN,
            RenderStepEnums.DISTRIBUTION,
            RenderStepEnums.PLATFORM_COMMISSION
    };

    /**
     * 交易创建前渲染
     * 渲染购物车 生成SN 》分销人员佣金渲染 》平台佣金渲染
     */
    public static RenderStepEnums[] pintuanTradeRender = {
            RenderStepEnums.CHECK_DATA,
            RenderStepEnums.SKU_PROMOTION,
            RenderStepEnums.COUPON,
            RenderStepEnums.SKU_FREIGHT,
            RenderStepEnums.CART_PRICE,
            RenderStepEnums.CART_SN,
            RenderStepEnums.DISTRIBUTION,
            RenderStepEnums.PLATFORM_COMMISSION
    };

    /**
     * 交易创建前渲染
     * 渲染购物车 生成SN 》分销人员佣金渲染 》平台佣金渲染
     */
    public static RenderStepEnums[] tradeRender = {
            RenderStepEnums.CHECKED_FILTER,
            RenderStepEnums.CHECK_DATA,
            RenderStepEnums.SKU_PROMOTION,
            RenderStepEnums.FULL_DISCOUNT,
            RenderStepEnums.COUPON,
            RenderStepEnums.SKU_FREIGHT,
            RenderStepEnums.CART_PRICE,
            RenderStepEnums.CART_SN,
            RenderStepEnums.DISTRIBUTION,
            RenderStepEnums.PLATFORM_COMMISSION
    };
}
(6)高层业务模块使用
java 复制代码
public class StrategyTest {
    public static void main(String[] args) {

        List<CartRenderStep> stepList = new ArrayList<>();
        stepList.add(new CartPriceRender());
        stepList.add(new CartSnRender());

        RenderStepContext context = new RenderStepContext(stepList);

        context.renderCartBySteps(new Object(), RenderStepStatement.test);
    }
}
相关推荐
lwf0061641 天前
解决macOS .dmg 文件无法安装问题
macos·策略模式
草莓熊Lotso2 天前
手搓工业级 C++ 线程安全日志系统:基于策略模式解耦,兼容 glog 使用风格
linux·运维·服务器·数据库·c++·安全·策略模式
蜜汁小强2 天前
macOS 开发者的 tmux 实战配置:分屏导航、vi 复制模式与系统剪贴板一站打通
macos·策略模式
AC赳赳老秦3 天前
OpenClaw与系统环境冲突:Windows/Mac系统兼容问题解决指南
开发语言·python·产品经理·策略模式·pygame·deepseek·openclaw
筱璦3 天前
C#期货分仓、策略交易模拟演示系统(含资源下载)
开发语言·c#·策略模式·量化交易·期货交易
艾莉丝努力练剑3 天前
【Linux线程】Linux系统多线程(八):<策略模式>日志系统的封装实现
linux·运维·服务器·c++·学习·策略模式
云空6 天前
《OpenClaw(macOS版)部署与使用中的安全问题及解决方案》
安全·macos·策略模式
Rsun045517 天前
13、Java 策略模式从入门到实战
java·bash·策略模式
小杍随笔7 天前
【Rust 1.95.0 正式发布!语言特性、标准库、平台支持全面升级,一文带你看完整更新】
开发语言·rust·策略模式
程序员老邢8 天前
【技术底稿 14】通用文件存储组件:SpringBoot 自动装配 + 多存储适配
java·spring boot·后端·阿里云·微服务·策略模式