策略模式Strategy

news2024/12/24 11:39:12

1.意图:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。此模式使得算法可以独立于使用它们的客户而变化。
2.结构
在这里插入图片描述
Strategy(策略)定义所有支持的算法的公共接口。Context使用这个接口来调用某ConcreteStrategy定义的算法。
ConcreteStrategy(具体策略)以Strategy接口实现某具体算法。
Context(上下文)用一个ConcreteStrategy对象来配置:维护一个对Strategy对象的引用;可定义一个接口来让Strategy访问它的数据。
3.适用性:
许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
需要使用一个算法的不同变体。例如,定义一些反映不通空间的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时,可以使用策略模式。
算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,将相关的条件分支移入它们各自的Strategy类中,已代替这些条件语句。
4.常见案例:替换if else
代码案例一
某软件公司预开发一款汽车竞速类游戏,需要模拟长轮胎和短轮胎刹车时在路面上留下的不同痕迹,并考虑后续能模拟更多中轮胎急刹车时的痕迹。线采用策略(Strategy)设计模式来实现该需求。
软件设计师考试2019年上半年下午题第6题

public class Strategy1 {
    public static void main(String[] args) {
        BrakeBehavior shortBrake = new ShortWheelBrake();
        WheelCar car = new WheelCar(shortBrake);
        car.brake();

        BrakeBehavior longBrake = new LongWheelBrake();
        car = new WheelCar(longBrake);
        car.brake();
    }
}

interface BrakeBehavior{
    void stop();
}
class LongWheelBrake implements BrakeBehavior{
    @Override
    public void stop() {
        System.out.println("模拟长轮胎刹车痕迹!");
    }
}
class ShortWheelBrake implements BrakeBehavior{
    @Override
    public void stop() {
        System.out.println("模拟短轮胎刹车痕迹!");
    }
}

abstract class Car{
    protected BrakeBehavior wheel;
    public void brake(){
        wheel.stop();
    }
}
class WheelCar extends Car{
    public WheelCar(BrakeBehavior behavior){
        wheel = behavior;
    }
}

运行结果
在这里插入图片描述
代码案例二
某大型购物中心预开发一套收银软件,要求其能够支持购物中心在不同时期推出的各种促销活动,如打折、返利(例如,满300减100)等等。现采用策略(Strategy)模式实现该要求。
软件设计师考试2015年下半年下午题第6题

public class Strategy2 {
    public static void main(String[] args) {
        CashContext cashContext = new CashContext(TYPE.NORMAL);
        System.out.print("正常收费:");
        System.out.println(cashContext.getResult(600));

        cashContext = new CashContext(TYPE.CASH_RETORN);
        System.out.print("满300返100:");
        System.out.println(cashContext.getResult(600));

        cashContext = new CashContext(TYPE.CASH_DISCOUNT);
        System.out.print("打八折:");
        System.out.println(cashContext.getResult(600));
    }
}

enum TYPE{NORMAL,CASH_DISCOUNT,CASH_RETORN}

interface CashSuper{
    double acceptCash(double money);
}
class CashNormal implements CashSuper{
    @Override
    public double acceptCash(double money) {
        return money;
    }
}
class CashDiscount implements CashSuper{
    private double moneyDiscount;//折扣率
    public CashDiscount(double moneyDiscount){
        this.moneyDiscount = moneyDiscount;
    }
    @Override
    public double acceptCash(double money) {
        return money*moneyDiscount;
    }
}
class CashReturn implements CashSuper{
    private double moneyCondition;
    private double moneyReturn;
    public CashReturn(double moneyCondition,double moneyReturn){
        this.moneyCondition = moneyCondition;
        this.moneyReturn = moneyReturn;
    }
    @Override
    public double acceptCash(double money) {
        double result = money;
        if(money>=moneyCondition){
            result = money - Math.floor(money/moneyCondition)*moneyReturn;
        }
        return result;
    }
}

class CashContext{
    private CashSuper cs;
    private TYPE t;
    public CashContext(TYPE t){
        switch (t){
            case NORMAL://正常收费
                cs = new CashNormal();
                break;
            case CASH_RETORN://300100
                cs = new CashReturn(300,100);
                break;
            case CASH_DISCOUNT://打八折
                cs = new CashDiscount(0.8);
                break;
            default:
                break;
        }
    }
    public double getResult(double money){
        return cs.acceptCash(money);
    }
}

运行结果
在这里插入图片描述

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

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

相关文章

小梅哥FPGA时序分析和约束实例演练课程

P1 FPGA基本原理 基本结构 三要素可类比电路板的器件、连线、对外端子 可编程逻辑功能块 触发器用于实现时序逻辑,进位链用于可编程逻辑块间通讯,使用较少。 具体器件的可编程逻辑功能块结构。第5代将四输入查找表升级到六输入查找表 由上面两个图抽象…

Flink系列-3、Flink入门案例

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 大数据系列文章目录 官方网址:https://flink.apache.org/ 学习资料:https://flink-learning.org.cn/ 目录Flink程序模型…

Linux内核中sk_buff结构详解

目录 1.sk_buff结构体 1.1 sk_buff在内核中的结构 1.2 重要的长度len的解析 2. sk_buff数据区 2.1 线性数据区 2.2 非线性数据区 ---------------------------------------------------------------------------------------------------------------------------- 1.s…

内置常量--R

1. R中内置的常量 R中内置的常量有:1. LETTERS: 26个大写英文字母2. letters: 26个小写英文字母3. month.abb: 月份英文前三个字母组成的缩写4. month.name: 月份的英文名字5. pi : 圆周率π

TensorRT介绍及使用

1、简介 TensorRT是一个针对已训练好模型的SDK,通过该SDK能够在NVIDIA的设备上进行高性能的推理。优点如下: 总结下来主要有以下6点: Reduced Precision:将模型量化成INT8或者FP16的数据类型(在保证精度不变或略微降…

Linux学习笔记——Linux实用操作(三)

4.10、环境变量 学习目标: 理解环境变量的作用掌握符号$的作用掌握在Linux中配置环境变量 4.10.1、环境变量 1、在讲解which命令的时候,我们知道使用的一系列命令其实本质上就是一个个的可执行程序。 比如,cd命令的本体就是:…

股价狂跌超70%,特斯拉到底怎么了?

​在2022年的尾声,曾在新能源汽车领域盛极一时的特斯拉即将取得上市以来最糟糕的年度表现,直接跌出全球上公司市值前10名。目前特斯拉已连续第7个交易日下跌,截至2022年12月28日,跌超11%,创八个月最大跌幅,…

Leetcode 855. 考场就座

在考场里,一排有 N 个座位,分别编号为 0, 1, 2, ..., N-1 。当学生进入考场后,他必须坐在能够使他与离他最近的人之间的距离达到最大化的座位上。如果有多个这样的座位,他会坐在编号最小的座位上。(另外,如果考场里没有…

「回顾2022,展望2023」- 技术和兴趣,工作和生活,我们都在旅途中

技术 Java,云原生,前端 技术面好像变窄了 远离CI/CD,重新回到起点 2019年毕业,2018年9月份在距离学校(南昌)不远不近的公司实习开始实习,毕业后去过深圳、上海,最后是杭州,到现在,又…

OV7670图像传感器介绍

OV7670图像传感器简介 OV7670是图像传感器,其体积小、工作电压低,能提供单片VGA摄像头和影像处理器的所有功能。通过SCCB 总线控制,可以输出整帧、子采样、取窗口等方式的各种分辨率8位影响数据。该产品VGA图像最高达到30帧/秒。用户可以完全…

西门子PLC串口协议与以太网通信协议对比

西门子plc品牌众多,通信协议的类型就更多了,具体可分为串口协议和以太网通信协议两大类。 串口协议主要有:MODBUS RTU 通信协议;PROFIBUS 通信协议;USS通信协议;PPI通信协议;MPI通信协议&#…

YGG:2022年年终回顾

2022 年,Yield Guild Games(YGG)扩大并发展了区块链游戏生态系统和开放的元宇宙。在这篇文章中,我们庆祝我们的公会成员、合作伙伴和社区所取得的里程碑式的成就,并期待接下来的发展。 游戏和基础设施合作伙伴的数量不…

推荐 6 个 GitHub 开源项目

本期推荐开源项目目录:1. B 站自动任务工具2. 学习 Solidity3. 高性能异步抖音爬取工具4. Java学习指南5. 中后台管理系统模版6. ChatGPT 中文调教指南01B 站自动任务工具BiliBiliTool 是一个自动化工具,它可以帮助你每天获取经验、每日签到、批量取关等…

分享几个嵌入式 C 中的实用技巧

1、动态绑定、回调函数 回调函数可以达到动态绑定的作用,在一定程度上可以降低层与层之间的耦合。关于回调函数,之前已经有写过一篇:C语言、嵌入式重点知识:回调函数。可能很多初学的小伙伴可能还不理解回调函数,可以…

【计算机图形学入门】笔记9:Shading3着色(插值、高级纹理映射)

09Shading3着色(插值、高级纹理映射)1.Barycentric Coordinates 重心坐标1.A点自己的重心坐标2.如何求出任意点的重心坐标?2.如何把纹理应用在实际的渲染中?Applying Textures3.Texture Magnification纹理放大。(解决纹…

Transform+ASM插桩系列(1)——熟悉Java字节码

前言 为什么要学习Java字节码呢,因为我们学的是插桩字节码技术,这块技术的根底就是字节码,要学会字节码的阅读和字节码的编写,虽然现在很多工具可以帮我们阅读和编写,但最根本的知识还是要理解的。万层楼高从地起&…

CTF之MISC题目-西游记

CTF系列文章 第一篇 CTF之密码学题目-classical && coding 第二篇 CTF之MISC题目-西游记 文章目录CTF系列文章前言一、题目是什么?二、解题步骤1.下载文件,解压2.暴力破解3.解压文件4.处理文本文件5.手动删除多余字符总结前言 CTF中关于MISC&a…

TensorFlow之回归模型-3

1 基本概念 回归模型 线性 线性模型 非线性模型 线性回归 逻辑回归 Log Loss(损失函数) 分类临界值 2 效率预测 如上所示,使用测试数据集进行评估、用图形显示逻辑回归的预测结果,其中,test_features是测试特…

hnu计网实验一-应用协议与数据包分析实验(使用Wireshark)

前言:这是个比较简单的实验,个人认为最难的不是分析部分,而是能否抓到一个好的包。为了抓到一个好的包我试了很多个网站,终于抓京东时抓到了令我个人最满意的包,因为没有其他各种杂乱的报文,就是那几条必要…

直流信号线性放大器非隔离转换模块0-10V转0-12V大功率负载180mA导轨安装

概述: 导轨安装DIN11 NIPO 系列模拟信号放大器是一种将输入信号放大、转换成按比例输出的直流信号放大器。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等需要直流信号测控的行业。此系列产品内部采用稳压电路,通过等比例控制线性放大输…