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)

相关推荐

  • 技术分享 | 用好 MySQL 的 MRR 优化器

    技术分享 | 用好 MySQL 的 MRR 优化器作者:蒋乐兴 MySQL DBA,擅长 python 和 SQL,目前维护着 github 的两个开源项目:mysqltools 、dbmc 以及独立博客:https://www.sqlpy.com…

    2023-03-12
    167
  • 解决Pycharm闪退问题!

    解决Pycharm闪退问题!Pycharm是Python开发最为常用的IDE之一,但是在使用过程中,有时会遇到Pycharm闪退的问题,严重影响开发效率。本篇文章将从多个方面探讨解决Pycharm闪退问题的方法,帮助读者更好地使用Pycharm进行开发。

    2024-05-25
    74
  • 关于使用python语言写的的信息「建议收藏」

    关于使用python语言写的的信息「建议收藏」Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。

    2023-08-25
    145
  • Python中的大小比较操作符

    Python中的大小比较操作符Python语言中的大小比较操作符是程序中常用的一种控制逻辑,它们可以用于比较两个值的大小关系,从而进行分支控制和循环控制等各种程序逻辑。本文将介绍Python中常见的大小比较操作符,并对它们的使用方法、注意事项和示例代码进行详细讲解。

    2024-03-24
    73
  • 《魔兽世界》亚服开放内地低延迟直连的“全球”服务器[通俗易懂]

    《魔兽世界》亚服开放内地低延迟直连的“全球”服务器[通俗易懂]11 月 24 日消息,暴雪与网易宣布“分手”后,《魔兽世界》等游戏的国服将于明年 1 月暂停,对于中国大陆的普通玩家来说基本等同于无法游玩。

    2023-06-28
    150
  • 【mybatis】mybatis 拦截器工作原理源码解析[亲测有效]

    【mybatis】mybatis 拦截器工作原理源码解析[亲测有效]mybatis 拦截器工作原理(JDK动态代理) 1. mybatis 拦截器案例 场景:分页查询,类似成熟产品:pagehelper, 这里只做简单原理演示 1.0 mybatis全局配置 Sql…

    2023-03-19
    138
  • 使用Python实现数据可视化

    使用Python实现数据可视化数据可视化是将数据转换为图形、图表等形式以便用户更好地理解数据分布规律、数据之间的关系、趋势等信息的过程。Python作为一种高效、灵活的编程语言,具有广泛的应用场景,尤其在数据科学领域被广泛使用。这篇文章将介绍如何使用Python实现数据可视化,包括Matplotlib、Seaborn、Plotly等库的使用。读者可以通过学习文章了解各种库的基本使用,以便在需要时选择合适的工具。

    2024-02-07
    91
  • SQL 如何查询连续上涨 N 次的记录[通俗易懂]

    SQL 如何查询连续上涨 N 次的记录[通俗易懂]用SQL如何查询连续上涨N次的记录? 这个问题用SQL来做很难! SQL的理论基础是无序集合,早期SQL也没有次序的概念,需要用JOIN造出次序,连续上涨这种问题就非常困难。后来在SQL2003标准…

    2023-03-06
    148

发表回复

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