一文让你读懂策略模式
2016-12-20 22:13
429 查看
首先从定义来看,
define:它定义了算法家族,分别封装起来,让他们之间相互的替换,使用此模式,不会影响到客户端的使用。
从一个简单的例子来说:
假如四六级考试中,考试委员会提出了一种优惠方案,连续报名3次考6级,将会优惠10元报名费和满350送20,满400送25,于是工程师连夜修改成绩登记系统,和交费系统,于是有了如下的代码:
但是因为第二年很多的考生通过这优惠条件考过了四六级,报名人数急剧减少,考委会连夜召开紧急会议商讨收费方案,终于决定连续报名5次才有优惠10元,满350送10满400送5.程序员连夜修改系统
假如考委会下次又需要改变策略,那么该怎么办呢?这时候就应该拥戴策略模式:
首先,我们定义一个策略的抽象类,他是所有策略的公共接口:
接下来需要写一个类,且继承Strategy , 封装好具体的算法和行为。
算法A
算法B
接下来写一个Context上下文类,使用具体算法来配置,从而调用一个策略
对于客户端,我们可以灵活的调用算法
define:它定义了算法家族,分别封装起来,让他们之间相互的替换,使用此模式,不会影响到客户端的使用。
从一个简单的例子来说:
假如四六级考试中,考试委员会提出了一种优惠方案,连续报名3次考6级,将会优惠10元报名费和满350送20,满400送25,于是工程师连夜修改成绩登记系统,和交费系统,于是有了如下的代码:
public void ComputerMoney(User user , Score score){ if(user.get次数==3){ float money = money-10; } if(score>350 && score<400){ score=+50; } if(score>450){ score=+25; } }
但是因为第二年很多的考生通过这优惠条件考过了四六级,报名人数急剧减少,考委会连夜召开紧急会议商讨收费方案,终于决定连续报名5次才有优惠10元,满350送10满400送5.程序员连夜修改系统
public void ComputerMoney(User user , Score score){ if(user.get次数==5){ float money = money-10; } if(score>350 && score<400){ score=+10; } if(score>450){ score=+5; } }
假如考委会下次又需要改变策略,那么该怎么办呢?这时候就应该拥戴策略模式:
首先,我们定义一个策略的抽象类,他是所有策略的公共接口:
package com.hemin.starge; public abstract class Strategy { public abstract void AlgorithmInterface(); }
接下来需要写一个类,且继承Strategy , 封装好具体的算法和行为。
算法A
package com.hemin.starge; public class ConcreateStrategyA extends Strategy { @Override public void AlgorithmInterface() { System.out.println("A"); }
算法B
package com.hemin.starge; public class ConcrateStrategyB extends Strategy { @Override public void AlgorithmInterface() { System.out.println("B"); } }
接下来写一个Context上下文类,使用具体算法来配置,从而调用一个策略
package com.hemin.starge; public class Context { Strategy strategy; public Context(Strategy strategy){ this.strategy = strategy; } public void ContextInterface(){ strategy.AlgorithmInterface(); } }
对于客户端,我们可以灵活的调用算法
package com.hemin.starge; public class Test { public static void main(String[] args) { Context context = new Context(new ConcreateStrategyA()); context.ContextInterface(); Context context2 = new Context(new ConcrateStrategyB()); context2.ContextInterface(); } }
相关文章推荐
- 从1维到6维,一文读懂多维数据可视化策略
- 如何一文读懂「进化策略」?这里有几组动图!
- 一文读懂 Netflix 的推荐探索策略 Contextual Bandits
- (22)策略模式-Strategy Pattern-康熙收复台湾-明珠和索额图的不同策略
- 设计模式实战(一)——使用策略模式(strategy pattern)实现多关键字排序
- 策略模式之C#版本(原创翻译版本)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- AspectJ实现设计模式(二)——策略模式
- 《Java与模式》学习笔记之九-----策略模式(Strategy Pattern)
- 从诸葛亮的三个锦囊妙计谈策略模式
- 设计模式(20)-策略模式(Strategy)
- [浪子学编程][MS Enterprise Library]ObjectBuilder之设计模式(一):策略模式
- 对象模型--策略、模式、应用 笔记1
- 应用泛型的策略模式
- 策略模式之C++版本
- 設計模式之Strategy(策略)
- 深入浅出策略模式
- 设计模式——策略模式
- 设计模式之策略模式(Strategy)