java策略设计模式_c++ 设计模式

java策略设计模式_c++ 设计模式本文简单介绍了如何在ES6中使用策略模式

本文由我们团队 肖建朋 学习总结

JavaScript设计模式之策略模式

定义

策略模式的定义是:定义一系列的算法,把它们封装起来,并且使它们可以相互替换。

将不变的部分和变化的部分隔开是每个设计模式的主题。策略模式就是将算法的使用和算法的实现分离开。

一个基于策略模式的程序至少包含两部分:

  1. 一组策略类,策略类封装了具体的算法,并负责具体的计算过程。
  2. 环境类Context,Context接收客户的请求,随后把请求委托给某一个策略类。

年终奖计算

使用策略模式来计算员工的年终奖。

很多公司的年终奖是根据员工的工资基数和年底绩效情况来发放的。例如,绩效为S 的人年
终奖有4 倍工资,绩效为A 的人年终奖有3 倍工资,而绩效为B 的人年终奖是2 倍工资。假设财
务部要求我们提供一段代码,来方便他们计算员工的年终奖。

java策略设计模式_c++ 设计模式

Calculate类

该类中包含一个年终奖计算方法strategies ,需要传入参数绩效等级策略strategy和基本工资salary,

根据传入不同的绩效等级做不同的处理返回不同的结果。

class Calculate {
    constructor() {
    }

    static strategies(strategy, salary) {
        switch(strategy) {
            case 'S':
                return salary * 4
            case 'A':
                return salary * 3
            case 'B':
                return salary * 2
            default:
                break
        }
        return 0
    }
}

Bonus类

Bonus类中包含属性 绩效等级策略strategy和 基本工资salary,还包含一个实例方法 取得年终奖getBonus

class Bonus {
    constructor(salaey, strategy) {
        this.salaey = salaey
        this.strategy = strategy
    }

    getBonus(salaey, strategy) {
        const result = Calculate.strategies(this.strategy, this.salaey)
        console.log(result)
        return result
    }
}

调用

使用下面代码进行调用测试输出:

let bonus = new Bonus(3000, 'S')
bonus.getBonus()// 日志中会输出12000

改进年终奖计算方法

通过以上示例我们已经使用策略模式实现了一个简单的年终奖计算的程序,但是我们会发现如果以后绩效等级出现了SS,C等等等级我们就要不断的修改Calculate类,在strategies方法的switch 循环中增加更多的case。这就违背了程序易维护的原则,那么我们怎么办呢?我们可以有多种解决方案,例如将可动态配置的部分放在配置文件中,或者我们可以放入数据库中,动态的获取最新的绩效等级。

这里我们使用从配置文件中获取绩效等级。这里我们建一个枚举类型 strategy

枚举类 Enum.js

这里我们定义一个strategy,用来放绩效等级。

/** * 绩效级别 */
const strategy = {
    SS: 5,
    S: 4,
    A: 3,
    B: 2
}

export {
    strategy
}
export default {
    strategy
}

改造Calculate类

我们将switch替换为return salary * strategy,这样依赖Calculate就看起来简单多了。

/** * 奖金计算类 */
class Calculate {
    constructor() {
    }

    static strategies(strategy, salary) {
        return salary * strategy
    }
}

export default Calculate

调用

此时我们在调用页面首先引入import {strategy} from '你的路径/Enum'

调用代码改为:

 let bonus = new Bonus(3000, strategy.SS)
 bonus.getBonus() // 日志中会输出15000

同样我们可以将工资salary,也维护成一个可配置的对象。

到这里我们已经使用策略模式实现了一个相对来说易维护的年终奖金计算功能。

总结

在实际项目中,策略模式对开发的作用远远不止于此,我们会把算法的含义扩散开来,使用策略模式来封装一些业务规则,只要这些业务规则的目标一致,且可被替换使用,那么就可以用策略模式来封装它们。例如可以用来做表单检验、动画等等。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/12883.html

(0)

相关推荐

  • CSR、 SSR、 SSG 和 ISR 的权衡「建议收藏」

    CSR、 SSR、 SSG 和 ISR 的权衡「建议收藏」携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情 NextJs 是一个非常流行的 React 框架,其中一个优美的特性是能够使用不同的呈现技术构建 Web

    2023-08-08
    128
  • Python列表排序指南

    Python列表排序指南Python列表是一种非常常用的数据类型,在实际编程中,我们经常需要对列表进行排序。排序是将列表按照某种规则进行重新排列的过程,Python提供了多种排序方式,本文将从多个方面对列表排序进行详细的阐述。

    2024-09-06
    5
  • Python程序员的必备技能:通过Python获取当前时间

    Python程序员的必备技能:通过Python获取当前时间在我们日常的开发工作中,获取当前时间是一个常见的需求。Python提供了丰富的时间处理库,使得我们可以轻松地获取当前时间并对时间进行处理。Python中可以使用time库和datetime库来进行时间处理。其中,time库是基于C语言实现的,提供了各种与时间相关的函数;datetime库是基于time库的封装,提供更加便捷的时间处理方法。下面将会分别介绍这两个库的使用。

    2024-02-02
    123
  • 基于 WebRTC 的 RTSP 视频实时预览「终于解决」

    基于 WebRTC 的 RTSP 视频实时预览「终于解决」目前已存在的基于 FFmpeg 的方案延迟都太高,所以项目最终选择基于此方案。你可以在下载的发布包中的html文件夹中找到 index.html

    2023-06-27
    122
  • Python GUI 开发:使用Tkinter创建美观直观用户界面

    Python GUI 开发:使用Tkinter创建美观直观用户界面项目开发中,良好的用户界面是确保项目质量的重要环节之一。Python作为一门跨平台的编程语言,也提供了多种GUI工具包供开发者使用。其中,Tkinter是Python自带的,也是使用最广泛的GUI工具包之一。本文将详细介绍如何使用Tkinter创建美观直观的用户界面。

    2024-02-01
    92
  • 代码签名证书,软件开发者不二之选

    代码签名证书,软件开发者不二之选2013年4月,台湾FTP服务器中AMI Aptio UEFI BIOS源代码泄露,甚至包括AMI专用UEFI BIOS签名测试密钥。

    2022-12-14
    296
  • Android Studio 3.6 稳定版发布[通俗易懂]

    Android Studio 3.6 稳定版发布[通俗易懂]我们很高兴为大家带来 Android Studio 3.6 的稳定版本,该版本提供的功能与特性旨在提升代码编辑和调试场景中的品质。已经结束的 Project Marble 聚焦于夯实集成开发环境 (IDE) 的功能和流程基础,而 Android Studio 3.6 则是 Pr…

    2023-08-10
    104
  • Python绘制箱线图

    Python绘制箱线图在数据分析和可视化过程中,箱线图是一种非常重要的图形,它可以帮助我们更好的了解数据分布情况、异常值的存在以及数据的极值、中位数等统计信息。

    2024-08-15
    25

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注