【设计模式】之策略模式
来源:互联网 发布:互联网金融 创业 知乎 编辑:程序博客网 时间:2024/05/21 00:00
一、什么是策略模式
策略模式的目的是定义一系列算法,把它们封装起来,并且使它们可以相互替换。
策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 策略模式的好处在于你可以动态的改变对象的行为。
二、设计模式的设计原则
设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++z中可以用虚类),然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。
策略模式属于对象行为型模式,主要针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。通常,策略模式适用于当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。
三、设计模式的组成
策略模式中有三个对象:
(1环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。
(2抽象策略对象:它可由接口或抽象类来实现。
(3具体策略对象:它封装了实现同不功能的不同算法。
利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择有环境对象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。
四、设计模式的实例
(1)类之间的关系
(2)代码实现
步骤一:创建接口
package study_02.designpattern.strategy;public interface Strategy { public int doOperation(int num1, int num2);}
步骤二:创建具体的接口实现抽象策略对象
package study_02.designpattern.strategy;public class OperationAdd implements Strategy{@Override public int doOperation(int num1, int num2) { return num1 + num2; }}
步骤三:创建具体的接口实现抽象策略对象
package study_02.designpattern.strategy;public class OperationSubstract implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 - num2; }}
步骤四:创建具体的接口实现抽象策略对象
package study_02.designpattern.strategy;public class OperationMultiply implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 * num2; }}
步骤五:创建环境对象
package study_02.designpattern.strategy;public class Context { private Strategy strategy; public Context(Strategy strategy){ this.strategy = strategy; } public int executeStrategy(int num1, int num2){ return strategy.doOperation(num1, num2); }}
步骤五:应用实例
package study_02.designpattern.strategy;public class StrategyPatternDemo { public static void main(String[] args) { Context context = new Context(new OperationAdd()); System.out.println("10 + 5 = " + context.executeStrategy(10, 5)); context = new Context(new OperationSubstract()); System.out.println("10 - 5 = " + context.executeStrategy(10, 5)); context = new Context(new OperationMultiply()); System.out.println("10 * 5 = " + context.executeStrategy(10, 5)); }}
步骤六:输出结果
10 + 5 = 15
10 - 5 = 5
10 * 5 = 50
五、策略模式的缺点:
(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类,这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。
(2)策略模式造成许多的策略类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。
六、参考资料
http://www.tutorialspoint.com/design_pattern/strategy_pattern.htm
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 【C/C++】Linux下使用system()函数详解
- Android getDecorView用途——屏幕截图
- 最简单的 Git 使用流程
- Linux下fstab参数配置详解
- 【Java基础】——内存结构
- 【设计模式】之策略模式
- C/C++调用外部程序整理
- SSH客户端设置环境变量
- 一个短小精悍的监控/守护进程
- Sysfs文件系统
- 火影下载(迅雷)
- 李开复 如何在中国成功(make it in china)
- 黑马程序员——交通灯管理系统
- HttpWatch工具简介及使用技巧