首页
学习
活动
专区
圈层
工具
发布

java中的策略模式(策略模式java)

策略模式 使用策略模式可以代替多重if-else和switch语句,让代码维护变得更加简单。...策略模式UML: 环境(Context)角色:持有一个Strategy的引用 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现 具体策略(ConcreteStrategy...// 具体使用策略 Fruit apple = new Apple(); // 将策略放入环境中并执行策略 new FruitPrice(apple).printFruitPrice...(Context)的一个状态所对应的行为 策略模式代码模板: package xyz.zeling.test.state.template.base; /** * @description 抽象状态角色...这一个个状态对应不同的处理,这是有顺序要求的。 策略模式:这个模式好比于你假期要出国游玩,有日本、美国、新加坡等国家,你每到一个国家就执行不同的游玩策略,可以先去日本,也可以先去美国,没有顺序要求。

1.4K31

【设计模式】汉堡中的设计模式——策略模式

目录 【设计模式】汉堡中的设计模式——策略模式 每章一句 前言 情景带入 开始分析 策略模式 尝试编码 如果我要新添加一种形式呢?...没有活动时,需要原价购买 我们常说要透过现象看本质,尽管形式很多,但是万变不离其中,最终是要付钱产生价值的,那就来分析一下这个流程吧!...,那么我们直接就定义一个顶层接口管理这些算法(相当于是AbstractStrategy),接口中有两个方法 一个是返回实际需要付多少钱 一个是返回实际取到的食物列表 具体如何实现,就是每个算法内部的事情了...,这很符合OCP原则,并且算法的具体实现也被完美的隐藏在各个实现类中,实在是很nice 策略模式的优点 其实刚刚也讲了,这里再总结一下 算法的具体实现封装在各个实现类中,客户端不需要知道 客户端可以根据场合随意切换到底要使用哪一种策略...【简单工厂+策略模式】之后小伙伴会有所疑问,这不就是把客户端的判断逻辑给转移到工厂中而已,虽然对于客户端来说,会更加的清爽,可是似乎没有根本性的解决问题,工厂中把if-else换成了switch-case

1.1K00
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    工作中的设计模式 —— 策略模式

    前言 策略模式是一种行为设计模式,它能让你定义一系列算法,并将每种算法分别放入独立的类中,以使算法的对象能够相互替换。...而使用策略模式的目的,就是当又增加了 ddd、eee 等等的时候,更方便的扩展。...这里以工作中遇到的场景举例: 这里选择使用理财储蓄场景中的计费策略举例:在理财储蓄场景中,需要每日给用户发放利息,同时用户分为普通用户、持卡用户,他们有分别的利率以及计息方式。 ?...很明显,在计费时要使用策略模式,按照以下模式进行开发。...{ return SpringContextHolder.getBean(userType.getServiceName()); } } 这里只是介绍了使用枚举维护用户类型和策略实现的关系

    69020

    Android 中的那些策略模式

    上篇文章 策略模式:网络小说的固定套路 介绍了策略模式 的基本概念,这篇文章我们来通过 Android 中的一些例子来加深对策略模式的理解。...首先祭上经典的策略模式 UML 图 可以看到,策略模式中主要有以下几个角色: Strategy 接口,用于定义算法的固定套路 ConcreteStrategyA , …..B , 等具体算法实现类 Context...策略模式例子 1 : ListAdapter 在 RecyclerView 还没火起来前,ListView 是一个很重要的组件,我们通常在布局里写个 ListView 组件,然后在代码中 setAdapter...对比文章开始给出的 策略模式 UML 图,可以发现 ListAdapter 就是 strategy 接口,ArrayAdpater 等就是具体的实现类,而在 ListView 中引用的是 接口 ListAdapter...总结 通过这两个例子,我的第一感觉是 : 策略模式中的“策略”名字都好像啊,后缀都一样!

    65140

    【C++】C++中的类型转化

    说起类型转化,我们在C语言之前的学习中可以了解到,类型转换可以分为两种情况:隐式类型转化;显示类型转化。但是为什么在c++中还要继续对类型转化做文章呢?我们一起来看: 1....C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与 接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换...+中的类型转换呢?...所以C++出了一套类型转化的规范写法。...隐式类型转化有些情况下可能会出问题:比如数据精度丢失 显式类型转换将所有情况混合在一起,代码不够清晰 因此C++提出了自己的类型转化风格,注意因为C++要兼容C语言,所以C++中还可以使用

    1.7K10

    C++中的POD类型

    C++ POD类型 背景 POD(Plain Old Data)指的是C++定义的和C相兼容的数据结构。...C++中的类类型引入了继承和派生等新概念,编译器无法解析这些复杂数据结构,因此C++提出POD数据结构的概念用于兼容C语言,由于C++中基本内置类型都是POD类型,因此我们一般讨论class、struct...POD类型的优势 1. C内存布局兼容 POD类型兼容C内存布局,C++可以直接使用C库函数操作POD数据类型,POD类型在C和C++间的操作总是安全的。 2....POD类型判断 在C++中,可以通过is_pod::value来判断某个类型是否是POD类型。...标准布局 所有非静态数据均为标准布局类型 所有基类均为标准布局类型 所有非静态成员具有相同的访问权限 没有虚函数 没有虚基类 类中的第一个非静态成员与其任何基类的类型不同 要么所有基类都没有非静态成员,

    3.5K41

    C++中的类型转换

    C++的类型转换 零、前言 一、C语言的类型转换 二、C++强制类型转换 1、static_cast 2、reinterpret_cast 3、const_cast 4、dynamic_cast 5、...explicit 三、常见面试题 零、前言 本章主要学习C++的四种类型转换 一、C语言的类型转换 概念及介绍: 在C语言中,如赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时...显式类型转换将所有情况混合在一起,代码不够清晰 因此C++提出了自己的类型转化风格,注意因为C++要兼容C语言,所以C++中还可以使用C语言的转化风格 二、C++强制类型转换 标准C...static_cast(d); cout<<a<<endl; return 0; } 2、reinterpret_cast reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释...使用特点: cosnt_cast是四种类型转换符中唯一可以对常量进行操作的转换符 去除常量性是一个危险的动作,尽量避免使用 reinterpreter_cast,仅仅重新解释类型,但没有进行二进制的转换

    2.7K20

    Python 中的设计模式详解之:策略模式

    1、策略模式概述 策略模式:定义一系列算法,把它们一一封装起来,并且使它们之间可以相互替换。此模式让算法的变化不会影响到使用算法的客户。...电商领域有个使用“策略”模式的经典案例,即根据客户的属性或订单中的商品计算折扣。 假如一个网店制定了下述折扣规则。 有 1000 或以上积分的顾客,每个订单享 5% 折扣。...在这个示例中,实例化订单(Order 类)之前,系统会以某种方式选择一种促销折扣策略,然后把它传给 Order 构造方法。具体怎么选择策略,不在这个模式的职责范围内。(选择策略可以使用工厂模式。)...42.00> 3、使用函数实现策略模式 在传统策略模式中,每个具体策略都是一个类,而且都只定义了一个方法,除此之外没有其他任何实例属性。...而 Python 中,函数天然就可以当做参数来传递。 值得注意的是,《设计模式:可复用面向对象软件的基础》一书的作者指出:“策略对象通常是很好的享元。”

    77120

    Java 8 中的设计模式策略

    概述在本篇文章中我们对可以在 Java 8 中的设计模式策略(strategy design pattern)进行一些简单的说明。如果你对 Java 的设计模式不是非常清楚的话,可以先自行脑补下。...我们简单的总结就是将以前 Java 使用的接口和实现的设计模式,在 Java 8 中可以使用 lambda 函数来进行简化。...在下面内容中,我们首先提供了一个简单的设计模式样例,以及在传统的环境下我们是怎么实现这个设计模式的。随后,我们将会使用 Java 8 中的 lambda 函数来进行实现,然后介绍一些有什么不同的地方。...模式策略所谓的模式策略(strategy pattern)的定义就是能够让我们的程序在运行时(runtime)改变算法的表现。...结论在本代码中,我们对 Java 8 中的设计模式策略(strategy design pattern)进行一些简单的说明,因为 lambda 表达式的使用,让我们能够使用更少的代码实现更多的功能。

    41700

    策略模式在应用中的实践

    行为模式有一种模式叫策略模式(Strategy Pattern),一个类的行为或其算法可以在运行时更改。...在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。...缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。 使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。...3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。...应用案例: 实现按任务类型执行类型相对应的任务,不同的任务对应的是不同的算法。 1.

    99610

    策略模式 在JavaScript中的实现

    策略模式(Strategy Pattern)是一种行为设计模式,它允许在运行时根据不同的情况选择不同的算法或行为。...该模式将算法封装成独立的 策略对象,使得这些策略对象可以互相替换,从而使得算法的变化独立于使用算法的客户端。 -- 来自查特著迪皮 需求 想要实现一个功能,点击不同按钮实现不同样式 原始代码 <!...也就是违背了 开放-封闭原则 (Open-Close Principle,OCP) 分析 以上问题就很适合使用 策略模式 在JavaScript中,策略模式可以通过以下方式理解: 定义策略对象:首先,你需要定义一组策略对象...因为以上过程只需要表示为 解决方案 1 普通对象 在JavaScript中,对象 object 天然具备 判断哪种策略 - 使用策略能力 对象[策略](); obj[key](); // 定义策略对象...})) 优化 神奇canvas 实现魔法摄像头的代码 传送门 可以看到,而已根据自身项目情况来考虑使用哪个版本的策略模式 以下提供优化后的代码

    1.5K00

    C++中的数组类型操作

    在我们需要信息或操作我们用不同维度启动的数组的情况下,这些函数非常有用。这些函数在头文件 中定义。一些功能包括: is_array() : 顾名思义,此函数的唯一目的是检查变量是否为数组类型。...这里值得注意的是,根据此函数,即使是 std::array 也不被视为数组。如果类型是数组,则“value”成员常量返回true,否则返回false。...is_same(): 此函数用于检查类型关系,如果两个类型具有完全相同的特征,则返回 true。如果类型相同,则“value”成员常量返回 true,否则返回 false。...,可应用于C++中的数组。...此函数返回数组特定维度的大小。此函数接受两个参数,数组类型和必须找到其大小的维度。这也具有打印值的成员常量值。

    2.3K30

    策略模式在实际业务中的应用

    策略模式结构图 策略模式主要由以上三个身份组成,这里我们就不过多及时策略模式的基础知识,默认大家已经对策略模式已经有了一个基础的认识。...return null; } } 第三步:策略控制类 由于策略模式有好多具体的具体策略实现,那么到底使用哪一个策略需要根据我们的入参,也就是我们业务中的广告类型进行判断,那么我们该如何优雅的进行判断呢...存在的问题: 违反开闭原则,每次增加新的策略实现类,都要加一个if判断; 随着策略实现类的增加,代码变的臃肿,越来越难以维护; ---- 基于这种情况,我们可不可以在项目启动的时候,将所有的策略实现类进行初始化...注解注入到了Spring容器中,所以我们可以直接从容器中,取到策略类的所有实现类。...改造 如果不想单独的定义一个类对广告类型和策略类进行一一映射,那么我们可不可以在策略类中进行解决,每个策略类实现类知道它要处理哪种类型,这样我们就可以把map中Key类路径的值替换为广告类型,这样就可以根据上报接口入参的广告类型

    1K50

    策略模式在业务中的实际应用

    Part1策略模式结构图 策略模式主要由以上三个身份组成,这里我们就不过多介绍策略模式的基础知识,默认大家已经对策略模式已经有了一个基础的认识。...return null; } } 第三步:策略控制类 由于策略模式有好多具体的具体策略实现,那么到底使用哪一个策略需要根据我们的入参,也就是我们业务中的广告类型进行判断,那么我们该如何优雅的进行判断呢...随着策略实现类的增加,代码变的臃肿,越来越难以维护; ---- 基于这种情况,我们可不可以在项目启动的时候,将所有的策略实现类进行初始化,存储在Map当中,广告类型作为key,实现类作为Value,我们看如下代码...注解注入到了Spring容器中,所以我们可以直接从容器中,取到策略类的所有实现类。...改造 如果不想单独的定义一个类对广告类型和策略类进行一一映射,那么我们可不可以在策略类中进行解决,每个策略类实现类知道它要处理哪种类型,这样我们就可以把map中Key类路径的值替换为广告类型,这样就可以根据上报接口入参的广告类型

    43420

    策略模式及Android源码中的应用

    策略模式 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。 使用场景: 1....针对同一类型问题的多种处理方式,仅仅是具体行为有差别时。 2. 需要安全地封装多种同一类型的操作时。 3....:" + quote); } } 结果 对于高级会员的折扣为20% 图书的最终价格为:240.0 策略模式和工厂模式的区别 工厂模式 策略模式 创建型的设计模式 行为型的设计模式 关注对象创建...关注行为的选择 黑盒子(无需知道具体的实现过程) 白盒子(知道具体的实现过程) 源码中的策略模式实现 ListAdapter ListView 是一个很重要的组件,我们通常在布局里写个 ListView...可以发现 ListAdapter 就是 strategy 接口,ArrayAdpater 等就是具体的实现类,而在 ListView 中引用的是 接口 ListAdapter,可以证实这就是一个 策略模式

    43320

    MySQL 中的锁类型及死锁避免策略

    引言 在数据库系统中,锁是一种重要的机制,用来管理并发访问数据的方式。在多个并发读写的事务同时操作数据库时,很容易出现资源争用的情况,这就需要使用锁来控制数据的访问权限,保证数据的一致性和完整性。...它被用来表示一个事务在获取该对象的锁之前是否会先获取其他类型的锁。...为了避免死锁的发生,我们可以采取以下几个策略: 合理设计数据库事务:尽量缩小事务的范围,避免长时间占用锁资源。...通过将 SELECT 语句的锁模式设置为 FOR UPDATE,事务可以获取到行锁,从而保证两个事务对同一行数据的修改是互斥的。...结论 MySQL 提供了多种不同的锁类型,包括共享锁、排他锁、意向锁、行锁、表锁和页锁。不同的锁适用于不同的场景和需求,开发人员应根据实际情况选择合适的锁类型。

    1.2K10

    设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章。在重构我们既有的代码时,往往会用到设计模式。在之前重构系列的博客中,我们在重构时用到了“工厂模式”、“策略模式”、“状态模式”等。...今天博客的主要思路是先围绕着“穿越火线”中的角色与武器的关系,通过策略模式来设计实现这种关系,整体的来整体感受一下“策略模式”的优点。...一、穿越火线中的“策略模式”(Strategy Pattern) 当然,这个示例是我YY出来的示例,不是“穿越火线”这个游戏的设计方案呢。...上面这种设计模式虽然不会产生重复的代码,但是如果给“军官”添加的武器过多的话,那么会导致相应的类中实现的接口过多,这并不是我们想要的。下方将会给出一个良好的解决方案,也就是使用策略模式。...下面是我们使用“策略模式”重新设计后的关系,具体请看下图。 ? 在上面的类“类图”中我们对可变的“武器策略进行了提取”。

    86760
    领券