首页 > 其他分享 >策略模式(Strategy Pattern)

策略模式(Strategy Pattern)

时间:2024-07-24 22:54:13浏览次数:17  
标签:SKU 渲染 Pattern 模式 Strategy CART 购物车 public RenderStepEnums

一.策略模式定义

1.Context封装角色

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

2.Strategy抽象策略角色

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

3.ConcreteStrategy具体策略角色

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

二. 示例

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

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

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

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

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

三.应用场景

1.电商平台购物车渲染
(1)定义购物车渲染枚举
/**
 * 购物车渲染枚举
 */
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)抽象购物车渲染步骤策略
/**
 * 购物车渲染
 */
public interface CartRenderStep {

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

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

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

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

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

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

    @Override
    public void render(TradeDTO tradeDTO) {
        //收货地址问题处理、校验等
        //运费模板选择等
        //选择物流的时候计算价格
        
    }
}
(4)封装购物车渲染策略
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)根据业务场景选择策略
/**
 * 购物车渲染 步骤声明
 *
 */
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)高层业务模块使用
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);
    }
}

标签:SKU,渲染,Pattern,模式,Strategy,CART,购物车,public,RenderStepEnums
From: https://blog.csdn.net/dashalen/article/details/140674716

相关文章

  • 设计模式之--解释器模式
    解释器模式(InterpreterPattern)是一种行为型设计模式,它定义了一个语言的文法,并且用一个解释器来解释这个语言的语法或表达式。在解释器模式中,通常会有一个抽象表达式类定义解释操作的接口,具体的解释操作由具体的表达式类实现。什么是解释器模式:解释器模式是一种设计模式,用于解......
  • 设计模式之-享元模式
    享元模式(FlyweightPattern)是一种结构型设计模式,旨在有效地支持大量细粒度对象的共享。什么是享元模式:享元模式是一种优化性能的设计模式,其核心思想是共享对象以减少内存使用和提高性能。在享元模式中,共享的对象被称为享元,而非共享的部分被称为外部状态。享元对象包含内部状态......
  • redis的持久化和集群模式
    redis的持久化什么是持久化把内存中的数据存储到磁盘的,同时也可以把磁盘中的数据加载到内存中redis实现持久化的方式erdis实现持久化的方式有两种:RDB、AOF第一种RDB(RedisDataBase快照模式,每隔一段时间对内存数据进行快照存储)触发方式手动触发:使用save或bgsave触发r......
  • rust 初探 -- 枚举和模式匹配
    rust初探–枚举和模式匹配定义枚举enumIpAddrKind{//将数据附加到枚举的变体中//-不需要额外使用struct//-每个变体可以拥有不同的类型以及关联的数据量V4(String),V6(String),}可以使用impl为枚举定义方法enumIpAddrKind{......
  • 【Gin】架构的精妙编织:Gin框架中组合模式的革新实践与技术深度解析(下)
    【Gin】架构的精妙编织:Gin框架中组合模式的革新实践与技术深度解析(下)大家好我是寸铁......
  • JAVA常见面试题-设计模式(单例模式实现)
    单例模式分为懒汉式与饿汉式,其中饿汉式较为常用。饿汉式publicclassSingleton{   privatestaticSingletoninstance=newSingleton();   privateSingleton(){}   publicstaticSingletongetInstance(){   returninstance; ......
  • 设计模式-代理模式(Proxy Pattern)
    设计模式-代理模式(ProxyPattern) 概要 记忆关键字:代理控制 定义:为其他对象提供一种代理以控制对这个对象的访问 分析: 1)通过代理类,给对象的行为增加辅助功能的解决方案,就是代理模式 2)在程序运行时,动态地为被代理对象生成代理类,借助编程语言当中的"反射"特性。 ......
  • 设计模式-抽象工厂模式(Abstract Factory Pattern)
    设计模式-抽象工厂模式(AbstractFactoryPattern)  概要   记忆关键词:抽象接口  定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。  分析:如果待创建的产品非常多,我们不需要为每一个产品类配上一个工厂类,而是可以把这些产品进行分组。抽象......
  • 设计模式-建造者模式(Builder)
    设计模式-建造者模式(Builder)  概要   记忆关键词:类和构造分离  定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。  分析:原型模式就是从一个样板对象中复制出一个内部属性一致的对象。它是在内存中拷贝二进制流,比new一个对象的性能......
  • 我想使用 torch DataLoader 并使用生产者/消费者模式,但它卡住了
    我想更改torchDataLoader,并在其中使用消费者/生产者模式。我有一个队列,一个线程将文件放入其中,这些项目由框架使用__getitem__使用。这是我的代码:importglobimporttimefromtorch.utils.dataimportDataLoader,Datasetimportthreadingimportqueue......