策略模式

案例分析:设计模式与代码的结构特性

我的未来我决定 提交于 2019-12-07 15:25:30
一. 什么是策略模式    这里引用百度百科的定义。策略模式是指有一定行动内容的相对稳定的策略名称。策略模式在古代中又称“计策”,简称“计”,如《汉书·高帝纪上》:“汉王从其计”。这里的“计”指的就是计谋、策略。策略模式具有相对稳定的形式,如“避实就虚”、“出奇制胜”等。一定的策略模式,既可应用于战略决策,也可应用于战术决策;既可实施于大系统的全局性行动,也可实施于大系统的局部性行动。 二. 策略模式的优缺点 无论哪种模式都有其优缺点,当然我们每次在编写代码的时候需要考虑下其利弊。 策略模式的优点: 1. 提供了快速替换继承关系的办法:案例中的我们能快速的替换僵尸类,速度,攻击类型。 2. 减少代码中的if else 等判断语句:我们在更换攻击状态的时候不用去判断,当达到某个条件时直接切换攻击实现类就可以了。比如上文中的普通攻击变超级攻击。 3. 实现的选择:策略模式可以提供不同的实现。 策略模式的缺点: 1. 策略模式会造成很多策略类:上文中的所有速度实现类,攻击实现类…… 2. 通讯开销很大:比如我们上面的速度接口的speed需要传递3个参数。这三个参数对有的僵尸类是有意义的,对大部分僵尸无意义,这时候就会造成没必要的通讯开销。 3. 必须自行知道所有的实现类有何不同?每次新建一个僵尸类的时候必须要知道所有的速度类及攻击实现类的不同。此时这些就会暴露出具体的实现问题

javaScript设计模式之策略模式

守給你的承諾、 提交于 2019-12-06 17:31:29
javaScript设计模式之策略模式 定义一系列的算法,把他们一个个封装起来,并且使他们可以互相替换 使用策略模式计算奖金 我们就用计算奖金为栗子,比如说绩效S就是4倍奖金,A绩效3倍奖金,B绩效2倍奖金,我们来提供一段代码,来方便计算 最初的代码实现 var calculateBonus = function( performanceLevel, salary ){ if ( performanceLevel === 'S' ){ return salary * 4; } if ( performanceLevel === 'A' ){ return salary * 3; } if ( performanceLevel === 'B' ){ return salary * 2; } }; calculateBonus( 'B', 20000 ); // 输出:40000 calculateBonus( 'S', 6000 ); // 输出:24000 可以发现,这段代码非常简单,但是有个缺点, calculateBonus 函数比较庞大,包含很多 if-else ` calculateBonus 函数缺乏弹性,比如需要修改一个绩效级别的奖金,就要深入函数内部实现,这样微分开放-封闭原则 算法复用性差,如果其他地方需要复用,还需要复制粘贴 使用策略模式-传统面向对象 var

7.策略模式

ぐ巨炮叔叔 提交于 2019-12-06 16:28:49
1.平常会遇到这样的事情,完成同一个功能可以使用不同的方式,比如排序,可以使用冒泡排序也可以使用快速排序。策略模式就是符合这样的情况,当完成一件事有多种实现方式,可以根据环境或者其他条件去选择不同的方式去实现。避免了硬编码的方式,扩展和变更更加方便。避免了代码的重复,算的使用和算法的实现分离开。 2.下面以去西藏为例,我们可以选择乘坐火车,骑自行车,步行,这三种方式都可以到达拉萨。我们可以根据不同的的情况灵活选择出行的方式。 3.实现 package com.java.dp.strategy; /** * @Author lizhilong * @create 2019/12/5 16:58 * @desc 出行策略接口 */ public interface Traffic { void trafficType(String name); } package com.java.dp.strategy; /** * @Author lizhilong * @create 2019/12/5 16:59 * @desc 火车出行 */ public class TrainType implements Traffic { @Override public void trafficType(String name) { System.out.println(name+":坐上火车去拉萨

第二章-策略模式

社会主义新天地 提交于 2019-12-06 12:07:10
面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。 商场收银软件的简单工厂实现 商场促销程序简单工厂UML图 #include<iostream> using namespace std; class CashSuper { public: virtual double acceptCash(double money) = 0; }; class CashNormal : public CashSuper { public: double acceptCash(double money) { return money; } }; class CashRebate : public CashSuper { private: double moneyRebate; public: CashRebate(double moneyRebate_t) : moneyRebate(moneyRebate_t) {} double acceptCash(double money) { return money * moneyRebate; } }; class CashReturn : public CashSuper { private: double moneyCondition; double moneyReturn;

设计模式再学习(下)

本秂侑毒 提交于 2019-12-06 10:28:28
写于2019-11-13 理解设计模式前的前堤: 1、模式的应用目标是把可维护性作为很重要指标的程序,像一次性的Demo程序就不需要多高的可维护性; 2、意识到并认可面向接口编程的好处,不认可请回看1; 3、设计模式的本质是解耦,解耦的根本手段是分层,分的层越多,关系越不直观; 4、不用设计模式完全不影响实现需求,只是写的代码多了,重构多了,写着写着,也就进入了设计模式的“窠臼”。 行为型模式 模板方法模式 模板方法也是用得很多的一种模式,尤其是在重构系统时。当你在两个以上相同的类,代码几乎一模一样,只有少许区别时,就要考虑是否用模板方法模式进行重构。父类定好算法步骤,通常将变化的部分封装成abstract方法,由子类实现该abstract方法。从另一个角度来看模板方法,其实它是对面向对象多态的补充,试想一下,多态是父类(接口)定好接口,子类分别实现之,可现实情况并不会总是如此简单,有些是可复用的部分,让每个子类各自重复实现这些可复用的代码明显是有问题的,重构方法就是把这部分可复用的代码前置到父类去写一份即可,那重构后不就是模板方法的应用了么?缺点就是父类调用子类方法,会增加调试的复杂性。 策略模式 既然是策略,那就是对调用方暴露的,即调用方需要了解有哪些策略。面向接口编程使得策略之间可以互相替换,变化部分通过策略类封装起来,也就意味着一个事情可以有多种实现方案,在使用if..

设计模式之原型模式、策略模式、观察者模式

一笑奈何 提交于 2019-12-06 09:52:29
一、原型模式 1、什么是原型模式 克隆 原型模式是一个创建型的模式。原型二字表明了改模式应该有一个样板实例,用户从这个样板对象中复制一个内部属性一致的对象,这个过程也就是我们称的“克隆”。被复制的实例就是我们所称的“原型”,这个原型是可定制的。原型模式多用于创建复杂的或者构造耗时的实例,因为这种情况下,复制一个已经存在的实例可使程序运行更高效。 2、原型模式应用场景 (1)类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等,通过原型拷贝避免这些消耗。 (2)通过new产生的一个对象需要非常繁琐的数据准备或者权限,这时可以使用原型模式。 (3)一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用,即保护性拷贝。 Spring框架中的多例就是使用原型。 3、原型模式UML类图(通用) 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件: (1)实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。 (2

设计模式应用-策略模式

夙愿已清 提交于 2019-12-06 06:42:35
平时的工作中小伙伴们比较关心的除了基本工资,岗位工资,各种补助吧啦吧啦,最后当然还有年终奖了,虽然不是人人都有的,举个栗子:绩效为A的小伙伴,年终奖为6个月工资;绩效为B的小伙伴,年终奖为3个月工资;绩效为C的小伙伴,年终奖为2个月工资,一个简单的薪资计算公式就来了 function calculateBonus (performanceLevel, salary) { if(performanceLevel==='A'){ return salary * 6 } if(performanceLevel==='B'){ return salary * 3 } if(performanceLevel==='C'){ return salary * 2 } } calculateBonus ('A', 2000) => 12000 轻松实现 分割线================================================================ 显然这样的方式可以实现想要的结果,但是从单一职责原则来看,对于不同的级别,有一天我们需要修改相应的奖金倍数,势必要改函数体的逻辑 考虑把计算逻辑抽离 let performanceA = function(salary){ return salary * 6 }; let performanceB =

策略模式

两盒软妹~` 提交于 2019-12-05 12:43:48
策略模式 一、定义:定义一组算法,将每个算法封装起来,并且他们可以相互替换。 二、特点:行为型模式,封装各种类型的规则,降低算法类和使用算法类之间的耦合。 三、示例代码,商场的优惠活动,有两种优惠方式,一种是打8折,一种是满500价格减少50。利用了简单工程模式和策略模式相结合。 //抽象算法类,定义所有支持的算法的公共接口。public abstract class CashSuper {​ abstract double getResult(double price);​}​ //具体的算法实现类,打折算法。public class CashRebate extends CashSuper { double rebate;​ public CashRebate(double rebate) { this.rebate = rebate; }​ @Override double getResult(double price) { double result; result = price * (int) (rebate / 10); return result; }​​} //具体的算法实现类,返现算法。public class CashReturn extends CashSuper {​ double condition = 0; double returnMoney=0;​

设计模式-策略模式

给你一囗甜甜゛ 提交于 2019-12-05 09:34:21
定义: Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from the clients that use it. (定义一组算法, 将每个算法都封装起来, 并且使它们之间可以互换. 策略模式使得算法可以独立于客户端变化.) 类图: [UML 类图] UML 类图分析: Context 叫做上下文, 起承上启下的封装作用, 屏蔽客户端对策略算法的直接访问, 客户端只需要调用 Context#operation() 方法即可调用底层的策略方法. Strategy 为策略接口, 声明策略算法方法, 具体策略需要实现 Strategy 接口, 如 ConcretedStrategyA, ConcretedStrategyB. 策略模式的应用: javax.servlet.http.HttpServlet#service() 方法, java.util.Comparator#compare() 方法, javax.servlet.Filter#doFilter() 方法 策略模式的不足: 增加新的策略就需要增加新的类, 策略类需要对外暴露, 客户端需要知道具体策略的存在.

js策略模式vs状态模式

ぃ、小莉子 提交于 2019-12-05 08:55:49
一.策略模式 1. 定义 :把一些小的算法,封装起来,使他们之间可以相互替换(把代码的实现和使用分离开来) 2.利用策略模式实现小方块缓动 html代码: <div id="container" style="width:500px;margin:0 auto;background-color: silver;"> <div id="move" style="position: absolute;background-color:blue;width:20px;height:20px"></div> </div> js代码: var container = document.getElementById('container'); container.style.height = window.innerHeight +"px"; var tween = {//t动画已消耗时间、b原始位置、c目标位置、d持续时间 linear:function(t,b,c,d){ return c*t/d+b; }, easeIn:function(t,b,c,d){ return c*(t/=d)*t+b; }, strongEaseIn:function(t,b,c,d){ return c*(t/=d)*t*t*t*t+b; }, strongEaseOut:function(t,b,c,d