策略设计模式知多少

目录

目标

概述

实现


目标

熟悉策略设计模式,了解策略设计模式的使用场景、具体实现。


概述

一、行为设计模式

行为设计模式是设计模式的一种类型。该类型的设计模式关注的重点在于对象的行为(通信和交互),而非对象的创建方式。较为常见的行为设计模式有:观察者模式、策略模式、命令模式、责任链模式等。优点是减少了对象之间的耦合度

二、策略设计模式

策略模式的核心思想是将算法使用分离。每一种算法单独创建一个类,算法类实现了算法接口。客户端可以自由挑选何种策略而不需要关注算法的实现,使得算法灵活替换。

优点

  • 提高了代码的扩展性和可维护性。
  • 灵活替换算法。
  • 提高代码的复用性。
  • 简化算法的维护。

缺点

  • 增加了系统的复杂度,因为每个算法都需要创建一个类去实现算法接口。
  • 使用方需要了解每一种算法的性质,因为使用方需要自己挑选算法。

三、使用场景

系统种有多个类似的算法,客户端需要根据不同的情况选择不同的算法。

四、列举策略模式在成熟的框架中的应用

  • Kafka消息存储策略、消息消费确认策略、消息重试策略等。
  • Netty框架中的ChannelPipeline类和ChannelHandler接口等都使用了策略模式。
  • MyBatis框架中的ResultSetHandler接口和StatementHandler接口等都使用了策略模式。

实现

需求

商品售卖分为:普通商品、促销商品,秒杀商品。不同的售卖方式有不同的折扣策略。请根据商品的售卖方式计算商品的具体售价。

商品实体类

package com.ctx.strategy;

// 商品类
public class Product {
    private String name; // 商品名称
    private double price; // 商品原价
    private SalesStrategy salesStrategy; // 商品销售策略

    public Product(String name, double price, SalesStrategy salesStrategy) {
        this.name = name;
        this.price = price;
        this.salesStrategy = salesStrategy;
    }

    public String getName() {
        return name;
    }

    // 获取商品售卖价格
    public double getPrice() {
        return salesStrategy.getPrice(price);
    }

    // 获取商品销售策略
    public String getSalesStrategy() {
        return salesStrategy.getSalesStrategy();
    }
}

算法接口类

package com.ctx.strategy;

// 销售策略接口
public interface SalesStrategy {
    // 获取商品售卖价格
    double getPrice(double price);
    // 获取商品销售策略
    String getSalesStrategy();
}

算法实现类

package com.ctx.strategy.type;

import com.ctx.strategy.SalesStrategy;

// 普通商品销售策略类
public class NormalSalesStrategy implements SalesStrategy {
    @Override
    // 普通商品售价为原价
    public double getPrice(double price) {
        return price;
    }

    @Override
    // 返回普通商品销售策略
    public String getSalesStrategy() {
        return "普通商品";
    }
}
package com.ctx.strategy.type;

import com.ctx.strategy.SalesStrategy;

// 促销商品销售策略类
public class PromotionalSalesStrategy implements SalesStrategy {
    @Override
    // 促销商品售价为原价的80%
    public double getPrice(double price) {
        return price * 0.8;
    }

    @Override
    // 返回促销商品销售策略
    public String getSalesStrategy() {
        return "促销商品";
    }
}
package com.ctx.strategy.type;

import com.ctx.strategy.SalesStrategy;

// 秒杀商品销售策略类
public class SeckillSalesStrategy implements SalesStrategy {
    @Override
    // 秒杀商品售价为原价的50%
    public double getPrice(double price) {
        return price * 0.5;
    }

    @Override
    // 返回秒杀商品销售策略
    public String getSalesStrategy() {
        return "秒杀商品";
    }
}

调用类

package com.ctx.strategy;

import com.ctx.strategy.type.NormalSalesStrategy;
import com.ctx.strategy.type.PromotionalSalesStrategy;
import com.ctx.strategy.type.SeckillSalesStrategy;

public class Test {
    public static void main(String[] args) {
        // 创建普通商品,原价为100元
        Product normalProduct = new Product("普通商品", 100, new NormalSalesStrategy());
        System.out.println(normalProduct.getName() + " 售价:" + normalProduct.getPrice() + " 元,销售策略:" + normalProduct.getSalesStrategy());
        // 输出:普通商品 售价:100.0 元,销售策略:普通商品

        // 创建促销商品,原价为200元
        Product promotionalProduct = new Product("促销商品", 200, new PromotionalSalesStrategy());
        System.out.println(promotionalProduct.getName() + " 售价:" + promotionalProduct.getPrice() + " 元,销售策略:" + promotionalProduct.getSalesStrategy());
        // 输出:促销商品 售价:160.0 元,销售策略:促销商品

        // 创建秒杀商品,原价为300元
        Product seckillProduct = new Product("秒杀商品", 300, new SeckillSalesStrategy());
        System.out.println(seckillProduct.getName() + " 售价:" + seckillProduct.getPrice() + " 元,销售策略:" + seckillProduct.getSalesStrategy());
        // 输出:秒杀商品 售价:150.0 元,销售策略:秒杀商品
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值