策略模式

设计模式---004策略模式(转载自我的老师 Alley-巷子)

那年仲夏 提交于 2019-11-29 02:35:27
一、设计模式概念   设计模式所强调的是代码的结构设计和解决问题的思路 二、策略模式   策略模式:所有的解决方案我们都应该提前设定好,不在根据当下的情形做判断,将不同的问题及不同的解决方案对应起来。   策略模式最大的好处就是将问题和解决方案做了映射关系的处理,这样就不需要每次进行判断      简单来说我们一般情况下周一、周二、周三上早班需要每天7点起床,周四、周五上中班每天10点起床,那么我们就会用手机提前订好闹钟,手机会根据当前的日期来决定闹钟几点响起,这就是最简单的策略模式 三、案例 var LoL = { hero:{ "盲僧":function(){ }, "亚索":function(){ }, "提莫":function(){ } }, create:function(type){ //这里填写什么? } } LoL.create("盲僧"); 思考我们如何通过type类型得到英雄这个对象? 我们第一时间想到的是switch判断,但是正确的答案是 return new this.hero[type]( ); 这样减少了代码的判断的逻辑,代码的执行效率也就提高了 来源: https://www.cnblogs.com/mp-0518/p/11440557.html

设计模式(一)策略模式

余生长醉 提交于 2019-11-29 01:56:51
1、面向对象的编程,并不是类越多越好,类的划分是为了封装,但 分类的基础是抽象 ,具有相同属性和功能的对象的 抽象集合才是类 。 2、 策略模式 :定义了 算法家族 ,分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。 3、策略模式的结构图: 4 来源: https://www.cnblogs.com/xy80hou/p/11438916.html

设计模式(三):策略者模式

点点圈 提交于 2019-11-29 01:56:28
今天学习策略者模式,策略者模式(StrategyPattern)(或者算法簇),通常用于业务经常发生改变。 参考:https://www.runoob.com/design-pattern/strategy-pattern.html 一个类的行为或算法可以在运行时发生改变,那么这种类型设计模式就是行为型设计模式。 在策略者设计模式,我们创建表示各种策略的对象和一个行为随着策略对象发生改变而改变的context对象,策略对象改变context对象的执行算法。 策略者解决的是在多种算法相似的情况下,使用if....else...ss等所带来的的复杂代码。 解决的思路是,将这些算法的代码封装成一个一个的类,实现统一接口。 使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。 注意事项: 如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题 优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。 缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。 案例一:计算器   //计算器接口    public

策略模式+工厂方法消除if...else

核能气质少年 提交于 2019-11-29 00:17:42
今天来讲一下如何通过策略模式和工厂方法来消除累赘的if...else,具体什么是策略模式,大家可以自行百度学习,我就不再这里做过多的介绍了。 注意:如果业务场景简单,建议使用if...else,因为代码逻辑简单,便于理解 策略接口 Eat.java /** * 策略接口 * */ public interface Eat { public void eatFruit(String fruit); } 策略类 EatApple.java /** * 具体的策略类:吃苹果 */ public class EatApple implements Eat{ @Override public void eatFruit(String fruit) { System.out.println("吃苹果"); } } EatBanana.java /** * 具体的策略类:吃香蕉 */ public class EatBanana implements Eat { @Override public void eatFruit(String fruit) { System.out.println("吃香蕉"); } } EatPear.java /** * 具体的策略类:吃梨 */ public class EatPear implements Eat { @Override public void

Spring策略模式的实现

谁说胖子不能爱 提交于 2019-11-28 19:26:31
场景: 有时候一个业务方法有多个实现类,需要根据特定的情形进行业务处理。 例如:商店支付,我们可以使用支付宝、微信扫描农行、xxx行的快捷支付(而不是微信支付、支付宝支付二维码)购买商品。 实现代码(代码和以上不相干,工作中实际使用的代码,供参考): public interface ConvertService{ /*** * 转换 * @param request * @return */ ConversionResponse convert(ConversionRequest request); } @Slf4j @Component("streamConveter") public class StreamConverter implements ConvertService { ... convert(ConversionRequest request) {} } @Slf4j @Component("ttsConverter") public class TTSConverter extends WebSocketClient implements ConvertService{ public ConversionResponse convert(ConversionRequest request){ } } class XXXImpl { @Autowired

004-行为型-01-策略模式(Strategy)

杀马特。学长 韩版系。学妹 提交于 2019-11-28 18:42:32
一、概述   定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数。 1.1、适用场景   多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。   需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。   在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。   对客户隐藏具体策略(算法)的实现细节,彼此完全独立。 1.2、优缺点 优点: 增加一个新的策略只需要添加一个具体的策略类即可,不需要改变- 原有的代码,符合“开闭原则” 避免适用多重条件转移语句。多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后。 提高算法的保密性和安全性 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免重复的代码。 策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类

设计模式简介及常用应用场景

有些话、适合烂在心里 提交于 2019-11-28 12:48:42
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。 常用应用场景: 工厂模式 :IOC就是典型的工厂模式 代理模式 :AOP就是代理实现的 Facade模式 :shiro框架的核心 单例模式 Spring默认就是单例 不变模式 string 八大基本数据类型都是单例 Future 模式 异步调用。即请求时只拿到一个契约,约定以后可以获取这个东西 来源: https://www.cnblogs.com/duguangming/p/11407721.html

《大话设计模式》策略模式

佐手、 提交于 2019-11-28 09:39:44
首先介绍一下策略模式的定义,如果看不大懂这个专业术语定义没关系,继续往下看,你就会明白啦。 策略模式(Strategy):它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。 接下来先给大家看一下 策略模式的结构图: Context上下文,用一个ConcreateStrategy来配置,维护一个对Strategy对象的引用;ConcreteStrategyA,ConcreteStrategyB,ConcreteStrategyC为具体策略类,封装了具体的算法或行为,继承Strategy。 Strategy类:定义所有支持的算法的公共接口 //抽象算法类 abstract class Strategy { //算法方法 public abstract void AlgorithmInterface ( ) ; } ConcreteStrategy,封装了具体的算法或行为,继承于Strategy class ConcreteStrategyA : Strategy { //算法 A 实现方法 public override void AlgorithmInterface() { Console . WriteLine ( "算法A实现" ) ; } } class ConcreteStrategyB : Strategy { //算法

js中的策略模式

允我心安 提交于 2019-11-28 08:13:13
定义 策略模式指的是定义一系列的算法,把它们一个个封装起来。将不变的部分和变化的部分隔开是每个设计模式的主题,策略模式也不例外,策略模式的目的就是将算法的使用与算法的实现分离开来。 通常一个基于策略模式的程序至少由两部分组成。第一个部分是一组策略类,策略类封装了具体 的算法,并负责具体的计算过程。 第二个部分是环境类 Context,Context 接受客户的请求,随后把请求委托给某一个策略类。 优点: 策略模式利用组合、委托和多态等技术和思想,可以有效地避免多重条件选择语句。 策略模式提供了对开放—封闭原则的完美支持,将算法封装在独立的 strategy 中,使得它 们易于切换,易于理解,易于扩展。 在策略模式中利用组合和委托来让 Context拥有执行算法的能力,这也是继承的一种更轻 便的替代方案。 例子 以下有一个例子:根据绩效的等级计算年终奖,绩效为S的人年终奖有4倍工资,绩效为A的人年终奖有3倍工资,而绩效为B的人年终奖是2倍工资 java版 // 以下的都是策略(strategy) var performanceS = function ( ) { } ; performanceS . prototype . calculate = function ( salary ) { return salary * 4 ; } var performanceA =

设计模式--简单工厂模式 策略模式

家住魔仙堡 提交于 2019-11-28 08:12:03
名词理解: 工厂(Factory)模式我们可以做如下理解, 假设有一个Audi的公司生产汽车(似乎也不用假设了),它掌握一项核心的技术就是生产汽车,另一方面,它生产的汽车是有不同型号的,并且在 不同的生产线上进行组装。当客户通过销售部门进行预定后,Audi公司将在指定的生产线上为客户生产出它所需要的汽车。 策略(Strategy)模式在结构上与工厂模式类似,唯一的区别是工厂模式实例化一个产品的操作是在服务端来做的,换句话说客户端传达给服务端的只是某种标识,服务端根据该标识实例化一个对象。而策略模式的客户端传达给服务端的是一个实例,服务端只是将该实例拿过去在服务端的环境里执行该实例的方法。这就好比一个对汽车不甚了解的人去买车,他在那一比划,说要什么什么样的,销售部门根据他的这个“比划”来形成一份订单,这就是工厂模式下的工作方式。而策略模式下那个顾客就是个行家,他自己给出了订单的详细信息,销售部门只是转了一下手就交给生产部门去做了。通过两相对比,我们不难发现,采用工厂模式必须提供足够灵活的销售部门,如果用户有了新的需求,销售部门必须马上意识到这样才可以做出合适的订单。所以倘一款新车出来了,生产部门和销售部门都需要更新,对顾客来说也需要更新对新车的描述所以需要改动的地方有三处。而策略模式中的销售部门工作比较固定,它只负责接受订单并执行特定的几个操作。当一款新车出来时