大话设计模式——18.策略模式(Strategy Pattern)

news2024/10/6 20:33:41

简介

是一系列算法的封装,即做的事情相同(方法名称相同)但是实现的方式不同,以相同方式调用所有的算法,减少算法与使用算法的耦合。直接调用方法。

UML图

在这里插入图片描述

应用场景
  • Java AWT中的LayoutManager(布局管理器)
  • 系统中存在多个类,它们的区别仅在于它们的行为
  • 不希望暴露复杂与算法有关的数据结构
  • Java中Comparator 接口常用的 compare()方法

示例

电商平台会经常进行商品优惠活动,对商品或订单价格进行改动

  1. 商品
public class Product {

    /**
     * 产品价格
     */
    private double price;

    /**
     * 产品名称
     */
    private String productName;

    public Product(double price, String productName) {
        this.price = price;
        this.productName = productName;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }
}
  1. 策略:活动优惠策略
public interface Strategy {

    /**
     * 计算商品价格
     *
     * @param product
     * @return
     */
    double computePrice(Product product);
}

没有活动:

public class NormalActivity implements Strategy {

    @Override
    public double computePrice(Product product) {
        return product.getPrice();
    }
}

打折活动:

public class DiscountActivity implements Strategy {

    private double discount;

    public DiscountActivity(double discount) {
        this.discount = discount;
    }

    @Override
    public double computePrice(Product product) {
        return product.getPrice() * discount;
    }
}

代金券活动:

public class VoucherActivity implements Strategy {

    /**
     * 代金券
     */
    private double voucher;


    public VoucherActivity(double voucher) {
        this.voucher = voucher;
    }

    @Override
    public double computePrice(Product product) {
        return product.getPrice() > voucher ? product.getPrice() - voucher : 0;
    }
}
  1. 活动上下文:选择适当的活动促销策略
public class PromotionContext {

    /**
     * 策略
     */
    private Strategy strategy;


    public PromotionContext(Strategy strategy) {
        this.strategy = strategy;
    }

    public double executeStrategy(Product product) {
        return this.strategy.computePrice(product);
    }
}
  1. 运行
public class Main {

    public static void main(String[] args) {

        // 创建商品
        Product phone = new Product(1999, "手机");

        // 促销策略
        PromotionContext promotionContext;

        // 原价
        promotionContext = new PromotionContext(new NormalActivity());
        System.out.println("原价:" + promotionContext.executeStrategy(phone));

        // 8折优惠
        promotionContext = new PromotionContext(new DiscountActivity(0.8));
        System.out.println("优惠价格:" + promotionContext.executeStrategy(phone));

        // 2000代金券
        promotionContext = new PromotionContext(new VoucherActivity(2000));
        System.out.println("券后价格:" + promotionContext.executeStrategy(phone));

    }
}

在这里插入图片描述

总结

  • 优点:

    • 满足开闭原则,当增加具体策略时,不需要修改上下文代码
    • 避免使用过多的条件判断,过多的条件判断语句不利于系统可维护性,扩展性和灵活性
  • 缺点

    • 策略类可能过多可能导致膨胀,复用性较小

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源铱塔切换MySQL数据库启动报异常

1.错误日志: 铱塔切换数据库配置为MySQL之后,启动后报错如下: SqlExceptionHelper - Table iotkit.task_info doesnt exist SqlExceptionHelper - Table iotkit.rule_info doesnt exist SqlExceptionHelper - Table iotkit.device_info does…

微软称在量子纠错领域取得大进展,量子超级计算机能在2033年问世?

大数据产业创新服务媒体 ——聚焦数据 改变商业 自从物理学家费曼(Richard Feynman)在80年代首次提出了利用量子力学原理进行计算的概念,无数科学家就梦想着用量子计算重塑未来。可惜现实往往“磕磕绊绊”,40多年过去了&#xff…

Element UI前端页面

1.前端 如何用ElementUI快速搭建一个前端网页模板,接下来会详细讲解! 1.Container布局 这是ElementUI官网提供的能快速搭建一个网页的基本布局模式,以下是一个网页的基本架构模式,主要分为三大块: AsideHeaderMain 我…

SpringBoot快速入门笔记(7)

文章目录 VueRouter前端路由1、简介2、RouterDemo3、子路由4、动态路由 VueRouter前端路由 1、简介 Vue的单页面应用是基于路由和组件的,不同组件的切换需要前端路由完成 vue-router3只能结合vue2,vue-router4只能结合vue3 安装 npm install vue-router…

FreeGPT3.5 开源软件

GPT-3.5不需要付费,也不需要注册用户,可以直接使用了,官方彻底开放了API接口。 该API政策一放开,GitHub很快就已经出现了一个开源项目FreeGPT35,可以自动生成key调用GPT3.5的API接口,再也用不着注册账号和申…

Hololens2远程音视频通话与AR远程空间标注,基于OpenXR+MRTK3+WebRTC实现

Hololens2远程音视频通话与AR远程空间标注 使用Unity2021.3.21版本开发,基于OpenXRMRTK3.0WebRTC实现。 (1)通过视频获取视频帧的矩阵的方法可以参考:https://learn.microsoft.com/zh-cn/windows/mixed-reality/develop/advanced…

强化学习:基础开发

基本就是把看到有用的资料整合在一起了 资料 https://blog.csdn.net/weixin_48878618/article/details/133590646 https://blog.csdn.net/weixin_42769131/article/details/104783188?ops_request_misc%257B%2522request%255Fid%2522%253A%2522166792845916800182132771%25…

【azure笔记 1】容器实例管理python sdk封装

容器实例管理python sdk封装 测试结果 说明 这是根据我的需求写的,所以有些参数是写死的,比如cpu核数和内存,你可以根据你的需要自行修改。前置条件: 当前环境已安装python3.8以上版本和azure cli并且已经登陆到你的账户 依赖安…

Angular 使用DomSanitizer

跨站脚本Cross-site scripting 简称XSS,是代码注入的一种,是一种网站应用程序的安全漏洞攻击。它允许恶意用户将代码注入到网页上,其他用户在使用网页时就会收到影响,这类攻击通常包含了HTML和用户端脚本语言(JS&…

echarts 条形图(柱状图)多个图例按钮默认高亮一个,且只能高亮一个

核心:给图例按钮添加点击事件 myChart.on("legendselectchanged", function (params) {let selected {功率柜: true,母线柜: false,充电桩终端: false,网络柜: false,};for (let key in selected) {if (key ! params.name) {myChart.setOption({legend:…

数据结构之来链表——单链表

什么是单链表: 文字说明: 单链表顾名思义,就是指单项链表,即只有一个方向的链性线性表。 图解: 如下图所示,即为链表(DATA为我们自己所定义的数据类型): 单链表的创建&am…

【jQuery】jQuery框架

目录 1.jQuery基本用法 1.1选择器 1.2jQuery对象 1.3事件绑定 1.4链式编程 1.5过滤方法 1.6样式操纵 1.6属性操纵 1.7操作value 1.8查找方法 1.9类名操纵 1.10事件进阶 1.11触发事件 1.12window事件绑定 2.节点操作与动画 2.1获取位置 2.2滚动距离 2.3显示/隐…

使用阿里云试用Elasticsearch学习:4. 聚合——1

在这之前,本书致力于搜索。 通过搜索,如果我们有一个查询并且希望找到匹配这个查询的文档集,就好比在大海捞针。 通过聚合,我们会得到一个数据的概览。我们需要的是分析和总结全套的数据而不是寻找单个文档: 在大海里…

ONERugged车载平板终端:提升港口运输水平

现代港口是国际贸易中至关重要的枢纽,而提高港口运输效率对于促进贸易流通和经济发展至关重要。近年来,车载平板技术的快速发展为港口运输行业带来了巨大的变革和机遇。车载平板的广泛应用不仅提高了港口的操作效率,还改善了货物跟踪、通信和…

【第七篇】使用BurpSuite进行主动、被动扫描和主动、被动爬虫

文章目录 前言主动扫描被动扫描主动爬虫被动爬虫前言 Burp Scanner 既可以用作全自动扫描仪,也可以用作增强手动测试工作流程的强大手段。 扫描网站涉及两个阶段: 抓取内容和功能: Burp Scanner 首先在目标站点周围导航,密切反映真实用户的行为。它对站点的结构和内容以及…

MATLAB Simulink仿真搭建及代码生成技术—01自定义新建模型模板

MATLAB Simulink仿真搭建及代码生成技术 目录 01-自定义新建模型模板点击运行:显示效果:查看模型设置: 01-自定义新建模型模板 新建模型代码如下: function new_model(modelname) %建立一个名为SmartAss的新的模型并打开 open_…

STM32-模数转化器

ADC(Analog-to-Digital Converter) 指模数转换器。是指将连续变化的模拟信号转换 为离散的数字信号的器件。 ADC相关参数说明: 分辨率: 分辨率以二进制(或十进制)数的位数来表示,一般有 8 位、10 位、12 位、16 位…

Linux登录访问限制

Linux系统下,用户密码的有效期可以通过编辑/etc/login.defs文件控制;密码复杂度规则设定需要通过/etc/pam.d/system-auth文件控制;登录失败次数限制通常由/etc/pam.d/login文件限制,可使用pam_tally2模块进行设置。 Linux系统下的…

uniapp小程序下载并导出excel

<button click"confirmExport">导出excel</button>confirmExport() {let header {"X-Access-Token": uni.getStorageSync(ACCESS_TOKEN), //自定义请求头信息} let url "http"/......"; // 后端API地址uni.request({url: ur…

【神经网络】生成对抗网络GAN

生成对抗网络GAN 欢迎访问Blog总目录&#xff01; 文章目录 生成对抗网络GAN1.学习链接2.GAN结构2.1.生成模型Generator2.2.判别模型Discrimintor2.3.伪代码 3.优缺点3.1.优势3.2.缺点 4.pytorch GAN4.1.API4.2.GAN的搭建4.2.1.结果4.2.2.代码 4.3.示意图:star: 1.学习链接 …