策略模式

策略模式(strategy)

我怕爱的太早我们不能终老 提交于 2019-11-27 15:11:37
策略模式在编程中使用接口,而不是对接口的实现 面向接口的编程 策略模式的定义 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换 策略模式使这些算法在客户端调用它们的时候能够互不影响地变化 策略模式的实现 策略模式的用意是针对一组算法,将每一个算 法封装到具有共同接口的独立的类中,从而使 得它们可以相互替换。 策略模式使得算法可以在不影响到客户端的情 况下发生变化。使用策略模式可以把行为和环 境分割开来。 环境类负责维持和查询行为类,各种算法则在 具体策略中提供。由于算法和环境独立开来, 算法的修改都不会影响环境和客户端 策略模式的编写步骤 对策略对象定义一个公共接口。 编写策略类,该类实现了上面的公共接口 在使用策略对象的类中保存一个对策略对 象的引用。 在使用策略对象的类中,实现对策略对象 的set和get方法(注入)或者使用构造方法完成赋值 来源: https://www.cnblogs.com/lhh666/p/11367973.html

设计模式之GOF23策略

时光怂恿深爱的人放手 提交于 2019-11-27 12:36:37
策略模式strategy 场景: 对不同客户的不同报价策略 如果采用if else不易扩展,不符合开闭原则,可以采用策略模式 策略模式: 对应于解决某一个问题的算法族,允许其中一个算法去解决某一问题,同时可以方便的更改和扩展算法,可以由客户端决定调用那个算法 结构: 抽象策略类,具体策略类(算法族),上下文类(客户端和算法类的分离),客户端类 本质: 分离算法,选择实现 开发中常见的场景 : -javase中的GUI编程,布局管理 -Spring框架中,Resource接口,资源访问策略 -javax.servlet.http.HrrpServlet#service() /** * 策略模式 * 通过对同一接口的不同实现,形成算法族 * @author 小帆敲代码 * */ public interface Strategy { double getPrice(double standardPrice); } class NewCustomerFewStrategy implements Strategy{ @Override public double getPrice(double standardPrice) { System.out.println("不打折,原价"); return standardPrice; } } class

策略模式【java版】

不羁岁月 提交于 2019-11-27 10:36:15
一、基本结构 组成: a)策略接口:1个 b)具体策略类:多个,封装了具体的算法和行为 c)调度类: 1个,持有某具体策略类的引用,供客户端使用 策略接口: //策略接口,定义了不同策略供外部调用的“通用方法”public interface StrategyInterface { public void multiWay_tour();} 具体策略类一: public class FirstConcreteStrategy implements StrategyInterface { public void multiWay_tour() {//策略方法的具体实现 System.out.println("I'll go tourism on feet!"); }} 具体策略类二: public class SecondConcreteStrategy implements StrategyInterface { public void multiWay_tour() {//策略方法的具体实现 System.out.println("I'll go tourism by train!"); }} 调度类: public class Context { private StrategyInterface strategyInterface; //调度类,根据传进来的具体策略对象的引用

行为型模式(七) 策略模式(Stragety)

≡放荡痞女 提交于 2019-11-27 10:24:00
动机(Motivate) 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题? 意图(Intent) 定义一系列算法,把它们一个个封装起来,并且使它们可互相替换。该模式使得算法可独立于使用它的客户而变化。 ——《设计模式》GoF 结构图(Structure) 模式的组成 可以看出,在策略模式的结构图有以下角色: (1)、环境角色(Context): 持有一个Strategy类的引用。 需要使用ConcreteStrategy提供的算法。 内部维护一个Strategy的实例。 负责动态设置运行时Strategy具体的实现算法。 负责跟Strategy之间的交互和数据传递 (2)、抽象策略角色(Strategy) :定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。 (3)、具体策略角色(ConcreteStrategy) :实现了Strategy定义的接口,提供具体的算法实现。 策略模式的代码实现 在现实生活中,策略模式的例子也是很多的,例如:一个公司会有很多工作种类,每个工作种类负责的工作不同

设计模式-策略模式

情到浓时终转凉″ 提交于 2019-11-27 10:18:04
定义 策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户 代码实例 interface Quack { void quack(); } interface Fly { void fly(); } class QuackBehavior implements Quack { @Override public void quack() { System.out.println("ga ga ga"); } } class FlyBehavior implements Fly { @Override public void fly() { System.out.println("fly fly fly"); } } abstract class Duck { private Quack quack; private Fly fly; public void setQuack(Quack quack) { this.quack = quack; } public void setFly(Fly fly) { this.fly = fly; } public void performQuack() { quack.quack(); } public void performFly() { fly.fly(); } } class

设计模式--策略模式

五迷三道 提交于 2019-11-27 09:30:47
策略模式的定义是: 定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。 很多公司的年终奖是根据员工的工资基数和年底绩效情况来发放的。例如,绩效为 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 函数缺乏弹性,如果增加了一种新的绩效等级 C ,或者想把绩效 S 的奖金系数改为 5 , 那我们必须深入 calculateBonus 函数的内部实现,这是违反开放 

策略模式(二十二)

余生长醉 提交于 2019-11-27 08:05:51
一个类的行为或其算法可以在运行时更改 意图 :定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换 菜鸟案例 : 我们将创建一个定义活动的 Strategy 接口和实现了 Strategy 接口的实体策略类。Context 是一个使用了某种策略的类。 StrategyPatternDemo,我们的演示类使用 Context 和策略对象来演示 Context 在它所配置或使用的策略改变时的行为变化。 拆图 上面就是一个策略的接口和它的三个策略实现类,很好理解,而 doOperation 就是实现策略的方法 Context 既然是用策略的实现类,那又是老套路,把策略的接口挂载 Context 里为成员属性,想要什么策略就给它什么策略。 上代码 (1)创建一个接口。 Strategy.java public interface Strategy { public int doOperation(int num1, int num2); } (2)创建实现接口的实体类。 OperationAdd.java public class OperationAdd implements Strategy{ //加法策略 @Override public int doOperation(int num1, int num2) { return num1 + num2; } }

策略模式---行为型

大憨熊 提交于 2019-11-27 07:56:58
1 基础知识 定义:定义了算法家族,分别封装起来,让他们可以相互替换,此模式让算法的变化不会影响到使用算法的用户(应用层)。特征:可以替换掉大量的if else语句 使用场景:系统有很多类,而区别仅在于行为不同;一个系统需要动态地在几种算法中选择一种。 优点:符合开闭原则;避免使用多重条件转移语句;提高算法的保密性和安全性。 缺点:客户端必须知道所有的策略类,并自行决定使用哪一个策略类;产生多个策略类。 来源: https://www.cnblogs.com/youngao/p/11352414.html

java设计模式--策略模式

妖精的绣舞 提交于 2019-11-27 03:49:47
策略模式    策略模式是对象行为型模式,它可以定义一系列的算法,并且将每个算法封装起来,在使用时可以相互替换,使得算法可以独立于客户的使用而变化。例如:今天我要从北京去深圳,我可以选择坐火车、坐高铁、坐飞机等方式出现,这样每一种方式耗费的时间不同,但是我能达到的目的都是相同的,我从北京到了深圳只是我耗费的时间不同而已,这样我就可以把三种出行方式分别封装到3个类里面根据不同情况可以自由变换算法,而作为客户的我都可以达到我想要的目的。这个就是策略模式。 策略模式的适用性 系统中存在许多相关的类仅仅是行为有异,策略模式可以提供一种用多个行为中的一个来配置一个类的方法。 算法使用客户不应该知道的数据,这样可以避免暴露复杂的与算法有关的数据结构。 一个类的行为可以通过多种算法来实现,在实现这个行为时,算法可以自由切换。 策略模式的结构图 策略模式中总共有三个角色: 1、抽象策略角色(Strategy):定义所有支持的算法的公共接口。 2、具体策略角色(ConcreteStrategy):实现Strategy接口并且实现自身的算法。 3、上下文(Context):维护一个Strategy对象的引用,同时定义一个接口通过Strategy来访问算法的数据。 策略模式的示例    定义一个抽象策略角色并且声明其算法的方法 public interface Strategy { public

用策略模式或工厂模式代替if-else

拟墨画扇 提交于 2019-11-27 03:13:11
正文 业务场景:根据条件判断调用支付宝,微信,或其他第三方支付; if(type==1){ 阿里支付(); }else if(type==2){ 微信支付(); }else{ 第三方支付(); } 如果还有更多的支付类型,就在后面使用 else if() 这也太那啥了吧。。。 代码 公共代码 AliPayStrategy /** * @author HJH * @Description: 支付宝 * @date 2019/8/12 15:56 */ public class AliPayStrategy implements PayStrategy { @Override public void pay(float money) { //调用支付宝的接口具体代码 略... if (money <= 200) { System.out.println("通过调用支付宝的接口" + "直接支付了" + money); } else { System.out.println("通过调用支付宝的接口" + "输入密码验证再支付了" + money); } } } WeChatPayStrategy /** * @author HJH * @Description: 微信 * @date 2019/8/12 15:57 */ public class WeChatPayStrategy