“灵活性之光:掌握策略模式塑造可扩展的代码未来“

文章目录

  • 一、概念
  • 二、策略模式的生活场景
  • 三、适用场景
  • 三、角色构成
  • 四、业务场景示例
  • 总结
    • 优点
    • 缺点


一、概念

  1. 策略模式(Strategy Pattern)又叫政策模式(Policy Pattern),属于行为型模式。
  2. 通过面向对象的继承和多态机制,从而实现同一行为在不同场景下具备不同实现。

二、策略模式的生活场景

  1. 个人的交税率与他的工资有关。
  2. 支付方式的选择,微信支付,支付宝支付,银联支付。

三、适用场景

  1. 针对同一类型问题,有多种处理方式,每一种都能独立解决问题;
  2. 算法需要自由切换的场景;
  3. 需要屏蔽算法规则的场景。

三、角色构成

上下文角色(Context): 用来操作策略的上下文环境,屏蔽高层模块(客户端)对策略,算法的直接访问,封装可能存在的变化;
抽象策略角色(Strategy): 规定策略或算法的行为
具体策略角色(ConcreteStrategy): 具体的策略或算法实现

四、业务场景示例

优惠活动

  1. 创建促销粗略对象PromotionStrategy
/**
 * <p>
 *  促销策略对象
 * </p>
 *
 * @author shiqi
 * @version 1.0.0
 * @createTime 2023-11-16
 */
public interface IPromotionStrategy {
    /**
     * 执行促销操作
     */
    void doPromotion();
}

  1. 创建优惠券抵扣策略对象
/**
 * <p>
 * 优惠券策略
 * </p>
 *
 * @author shiqi
 * @version 1.0.0
 * @createTime 2023-11-16
 */
public class CouponStrategy implements IPromotionStrategy{
    @Override
    public void doPromotion() {
        System.out.println("使用优惠券抵扣");
    }
}
  1. 创建返现促销策略对象CashbackStrategy
/**
 * <p>
 * 返现策略
 * </p>
 *
 * @author shiqi
 * @version 1.0.0
 * @createTime 2023-11-16
 */
public class CashbackStrategy implements IPromotionStrategy{
    @Override
    public void doPromotion() {
        System.out.println("返现,直接打款到支付宝帐号");
    }
}
  1. 创建拼团优惠策略对象
/**
 * <p>
 * 团购策略
 * </p>
 *
 * @author shiqi
 * @version 1.0.0
 * @createTime 2023-11-16
 */
public class GroupbuyStrategy implements IPromotionStrategy{
    @Override
    public void doPromotion() {
        System.out.println("5人成团,可以优惠");
    }
}
  1. 无优惠策略对象
/**
 * <p>
 * 无优惠
 * </p>
 *
 * @author shiqi
 * @version 1.0.0
 * @createTime 2023-11-16
 */
public class EmptyStrategy implements IPromotionStrategy{
    @Override
    public void doPromotion() {
        System.out.println("无优惠");
    }
}
  1. 创建促销活动方案
/**
 * <p>
 * 促销活动方案
 * </p>
 *
 * @author shiqi
 * @version 1.0.0
 * @createTime 2023-11-16
 */
public class PromotionActivity {

    private IPromotionStrategy promotionStrategy;

    @SuppressWarnings("all")
    public PromotionActivity(IPromotionStrategy promotionStrategy) {
        this.promotionStrategy = promotionStrategy;
    }

    /**
     * 执行促销策略
     */
    public void executePromotionStrategy() {
        promotionStrategy.doPromotion();
    }

}
  1. 编写客户端测试类
public class Test {
    public static void main(String[] args) {
        PromotionActivity promotionActivity=null;

        // 获取促销策略
        String promotionKey= "COUPON";


        if(StringUtils.equals(promotionKey,"COUPON")){
            promotionActivity=new PromotionActivity(new CouponStrategy());
        }else if(StringUtils.equals(promotionKey,"CASHBACK")){
            promotionActivity=new PromotionActivity(new CashbackStrategy());
        }//....
  promotionActivity.executePromotionStrategy();
    }
}

此客户端弊端在于if else太多了,随着业务的扩展只会越来越臃肿,所以需要改造。

  1. 创建促销策略工厂类
public class PromotionStrategyFactory {

    public static Map<String,IPromotionStrategy> PROMOTION_STRATEGY_MAP = new HashMap<>();

    static {
        PROMOTION_STRATEGY_MAP.put(PromotionKey.EMPTY,new EmptyStrategy());
        PROMOTION_STRATEGY_MAP.put(PromotionKey.COUPON,new CouponStrategy());
        PROMOTION_STRATEGY_MAP.put(PromotionKey.CASHBACK,new CashbackStrategy());
        PROMOTION_STRATEGY_MAP.put(PromotionKey.GROUPBUY,new GroupbuyStrategy());
    }

    public interface PromotionKey{
        String EMPTY = "EMPTY";
        String COUPON = "COUPON";
        String CASHBACK = "CASHBACK";
        String GROUPBUY = "GROUPBUY";
    }

    /**
     * 获取促销策略的键集合
     *
     * @return 促销策略的键集合
     */
    public static Set<String> getPromotionStrategyKeys(){
        return PROMOTION_STRATEGY_MAP.keySet();
    }


    /**
     * 根据促销码获取促销策略
     * @param promotionKey 促销码
     * @return 促销策略
     */
    public static IPromotionStrategy getPromotionStrategy(String promotionKey){
        return PROMOTION_STRATEGY_MAP.get(promotionKey);
    }

}
  1. 改写客户端
public class Test {
   public static void main(String[] args) {
       // 获取促销策略
       String promotionKey= "COUPON";
       IPromotionStrategy promotionStrategy = PromotionStrategyFactory.getPromotionStrategy(promotionKey);
       promotionStrategy.doPromotion();
   }
}

总结

优点

  1. 策略模式符合开闭原则
  2. 避免使用多重条件转移语句,如if…else…语句,switch语句
  3. 使用策略模式可以提高算法的保密性和安全性。

缺点

  1. 客户端必须知道所有的策略,并且自行决定使用哪一个策略类。
  2. 代码中会产生非常多策略类,增加维护难度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/156452.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python基础篇】字符串的拼接

博主&#xff1a;&#x1f44d;不许代码码上红 欢迎&#xff1a;&#x1f40b;点赞、收藏、关注、评论。 格言&#xff1a; 大鹏一日同风起&#xff0c;扶摇直上九万里。 文章目录 一 Python中的字符串拼接二 join函数拼接三 os.path.join函数拼接四 号拼接五 &#xff0c;号…

Git面经

Git八股文 第一章 git基础 1.1 什么是git git是一款免费的开源的分布式版本控制系统 1.2 为什么要使用git 为了保留之前的所有版本&#xff0c;方便回滚或修改 1.3 集中化版本控制系统和分布式版本控制系统的区别 集中化版本控制系统如svn&#xff0c;客户端连接到中央服…

金蝶云星空签出元数据提示“数据中心业务对象版本高于应用版本”

文章目录 数据中心业务对象版本高于应用版本签出元数据提示建议 数据中心业务对象版本高于应用版本 签出元数据提示 建议 每次签出元数据前&#xff0c;先获取最新的代码后再签出&#xff0c;如果还是提示&#xff0c;那就根据你的情况选择版本。

001.前置知识

1、硬件 我们知道&#xff0c;组成计算机的硬件主要有“主机”和“输入/输出设备”。 主机包括机箱、电源、主板、CPU&#xff08;Central Processing Unit&#xff0c;中央处理器&#xff09;、内存、显卡、声卡、网卡、 硬盘、光驱等。输入/输出设备包括显示器、键盘、鼠标…

什么是BT种子!磁力链接又是如何工作的?

目录 一.什么是BT&#xff1f;1.BT简介&#xff1a;1.1.BT是目前最热门的下载方式之一1.2.BT服务器是通过一种传销的方式来实现文件共享的 2.小知识&#xff1a;2.1.你知道吗BT下载和常规下载到底有哪些不同2.2.BT下载的灵魂&#xff1a;种子2.3.当下载结束后&#xff0c;如果未…

Python调用企微机器人: 发送常用格式汇总

企微接口文档 发送应用消息 - 接口文档 - 企业微信开发者中心 发送格式 应用支持推送文本、图片、视频、文件、图文等类型。 ~~~以下列举常用格式 示例~~~ 1.发送文本 代码如下&#xff1a; def sendtxt_robotmsg(self):# 正式keywx_key "xx"wx_webhookurl htt…

K8s 命令行

前言&#xff1a;关于k8s 与 docker Docker和Kubernetes&#xff08;通常简称为K8s&#xff09;是两个在容器化应用程序方面非常流行的开源工具。 Docker: Docker 是一种轻量级的容器化平台&#xff0c;允许开发者将应用程序及其所有依赖项打包到一个称为容器的可移植容器中…

【C++】AVL树(动图详解)

文章目录 一、前言二、AVL树的概念&#xff08;引入bf&#xff09;三、AVL节点树的定义四、AVL树的基本框架五、AVL树的旋转5.1左单旋&#xff08;新节点插入较高右子树的右侧---右右&#xff1a;左单旋&#xff09;例一&#xff08;h0&#xff09;例二&#xff08;h1&#xff…

C/C++算法-----------------------双指针详解技巧及例题

双指针 基本介绍降低时间复杂度降低时间复杂度例题 验证回文串判断是否为环反转链表总结 基本介绍 双指针&#xff08;two poinnters&#xff09;实际上是一种算法编程里的一种思想&#xff0c;它更像是一种编程思想&#xff0c;提供看非常高的算法效率&#xff0c;一般来说双…

FL Studio水果软件2025中文破解版注册机

你是否体验过Tomorrowland现场万人蹦迪的的激情&#xff1f;又是否加入过“死墙&#xff08;Mosh pit&#xff1a;一种Bass音乐节常有的娱乐方式&#xff09;”的狂欢盛宴&#xff1f;随着时代发展&#xff0c;以电子音乐为代表的数字音乐已然象征着时尚与潮流。在这股风靡全球…

fiddler展示接口的响应时间

最近项目组迁移了一个新项目&#xff0c;想对比迁移前后访问菜单的响应时间是否有变化&#xff0c;因为没需求文档&#xff0c;所以只有靠fiddler一个个的抓接口来看&#xff0c;开发经理想要看具体每个接口耗时&#xff0c;虽然点击接口&#xff0c;在页面上也能看到接口响应时…

HackTheBox-Starting Point--Tier 2---Markup

文章目录 一 Markup测试过程1.1 打点1.2 权限获取1.3 权限升级 二 题目 一 Markup测试过程 1.1 打点 1.端口扫描 nmap -A -Pn -sC 10.129.95.1922.访问web网站&#xff0c;登录口爆破发现存在弱口令admin&#xff1a;password 3.抓包&#xff0c;发现请求体是XML格式 4.尝试使…

购买阿里云服务器需要多少钱?活动价3000元-5000元的阿里云服务器汇总

购买阿里云服务器需要多少钱&#xff1f;如果我们只有3000元-5000元的预算可以购买什么实例规格和配置的阿里云服务器呢&#xff1f;因为阿里云服务器价格是由实例规格、配置、带宽等众多配置决定的&#xff0c;所以&#xff0c;目前阿里云活动中的价格在3000元-5000元的云服务…

购买阿里云服务器需要多少钱?活动价2000元-3000元的阿里云服务器汇总

购买阿里云服务器需要多少钱&#xff1f;如果我们只有2000元-3000元的预算可以购买什么实例规格和配置的阿里云服务器呢&#xff1f;因为阿里云服务器价格是由实例规格、配置、带宽等众多配置决定的&#xff0c;所以&#xff0c;目前阿里云活动中的价格在2000元-3000元的云服务…

一文揭秘共享wifi二维码项目推广技巧!

随着无线网络的普及和移动互联网的快速发展&#xff0c;共享WiFi已成为人们生活中不可或缺的一部分。共享WiFi二维码项目作为一个独具创意的共享项目&#xff0c;将二维码推广与共享WiFi相结合&#xff0c;不仅可以提升品牌曝光度&#xff0c;还能为用户提供便捷的上网体验。那…

什么是圆锥的准线?

定曲线C叫做锥面的准线&#xff0c;构成曲面的每一条直线叫做母线。

RedHat公司及红帽认证介绍丨红帽认证等级介绍

RedHat公司及红帽认证介绍 红帽公司成立工1993年&#xff0c;是全球首家收入超10亿美元的开源公司&#xff0c;总部位于美国&#xff0c;分支机构遍布全球。红帽公司作头全球领先的开源和Linux系统提供商&#xff0c;其产品已被业界广泛认可并使用&#xff0c;尤其是RHEL系统在…

CentOs 7 PHP安装和配置

目录 1 安装epel源 2 安装REMI源 3 安装yum源管理工具 4 安装PHP7.3 5 启动php服务 6 设置PHP 6.1 查找安装包 6.2 查找PHP安装位置 6.3 查找php配置文件位置 6.4 配置PHP 6.5 设置快捷命令 6.6 查看php版本 6.7 更新php 1 安装epel源 yum -y install epel-release 2 安…

数据仓库基础

ODS&#xff08;Operational Data Store&#xff09;层&#xff1a;操作数据存储。存放原始数据&#xff0c;直接加载原始日志、数据&#xff0c;起到备份数据的作用。数据采用压缩&#xff0c;减少磁盘存储空间。创建分区表&#xff0c;防止后续的全表扫描。 DWD(data wareho…

MatrixOne 支持多样化生态工具

近日&#xff0c;云原生数据库 MatrixOne 支持多样化生态工具&#xff0c;包括&#xff1a;数据集成工具、BI 工具和数据计算引擎这三类生态工具。 云原生数据库使得传统数据库得以充分结合云服务的免运维、高弹性、高可扩展、高可用、高性价比优势&#xff0c;又顺应了云端应…
最新文章