`
kanwoerzi
  • 浏览: 1640493 次
文章分类
社区版块
存档分类
最新评论

策略模式原理及例子代码

 
阅读更多

策略模式将行为和环境隔离开来,环境角色类负责维持和查询行为的类,各种类似的逻辑算法都在各个具体的策略类中进行实现,由于环境和行为隔离开来,所以行为的逻辑变更不会影响到环境和客户端。

如果要使用策略类,则必须先抽象出需要包装的逻辑算法,试图从环境中分隔开来。策略模式一般都是将一个系列的逻辑算法包装到一些列的策略类中,来作为一个抽象策略类的子类。

策略模式涉及到三个角色:

  • 环境角色
  • 抽象策略角色
  • 具体策略角色

举一个简单的例子。

假设现在在开发一个养殖管理系统。该系统用来对养殖过程中的整个流程进行管理。其中的一个模块是关于禽类的喂养管理等。一个养殖专业户喂养了多种禽类(如兔子,鸡,猪),养殖人员每天都需要给他们喂食物。由于不同的禽类都吃不一样的东西,在这里,对于喂养(feed)这个动作,这个就是一个策略。这里只是简化说明,其中省略很多的逻辑方法等,只为了说明这个问题.
应用策略模式,对应的三个角色如下:
环境角色: 这里是feeder(饲养员)
抽象策略角色:这里是禽类的喂养 FowlFeed()
具体策略角色: 针对不同的的宠物的喂养方法或者行为RabbitFeed,HenFeed,PigFeed 等

用代码实现如下:

环境角色类 Feeder:

Java代码 复制代码收藏代码
  1. packagecom.longweir.strategy;
  2. /*
  3. 这里是环境角色Feeder
  4. */
  5. publicclassFeeder
  6. {
  7. privateFowlFeedfowlfeed;
  8. publicvoidsetFowlFeed(FowlFeedfowlfeed){
  9. this.fowlfeed=fowlfeed;
  10. }
  11. publicFowlFeedgetFowlFeed(){
  12. returnfowlfeed;
  13. }
  14. //构造方法1
  15. publicFeeder(){}
  16. //构造方法2
  17. publicFeeder(FowlFeedfowlfeed){
  18. this.fowlfeed=fowlfeed;
  19. }
  20. //策略方法feed()
  21. publicvoidfeedInterface(){
  22. fowlfeed.feed();
  23. }
  24. //该类的其他的方法
  25. }

抽象策略角色FowlFeed,这里使用接口代替,也可以使用抽象类

Java代码 复制代码收藏代码
  1. /*
  2. FowlFeed为抽象的策略类这里使用接口来描述
  3. 其他的具体策略类必须实现这个接口中的feed()方法
  4. */
  5. packagecom.longweir.strategy;
  6. interfaceFowlFeed
  7. {
  8. publicvoidfeed();
  9. }

具体策略类,关于喂养兔子 RabbitFeed:

Java代码 复制代码收藏代码
  1. packagecom.longweir.strategy;
  2. /*
  3. 具体的策略类--喂养兔子
  4. */
  5. publicclassRabbitFeedimplementsFowlFeed
  6. {
  7. //构造方法
  8. publicRabbitFeed(){
  9. }
  10. //喂养兔子的策略方法,实现抽象策略中的方法
  11. publicvoidfeed(){
  12. System.out.println("喂兔子吃青菜和萝卜");
  13. }
  14. }

具体的策略类,关于喂养猪 PigFeed:

Java代码 复制代码收藏代码
  1. packagecom.longweir.strategy;
  2. /*
  3. 具体的策略类--喂养猪的策略方法
  4. */
  5. publicclassPigFeedimplementsFowlFeed
  6. {
  7. publicPigFeed(){}
  8. //喂养猪的策略方法,实现抽象策略中的方法
  9. publicvoidfeed(){
  10. System.out.println("喂猪吃糠和泔水");
  11. }
  12. }

具体的策略类,关于喂养母鸡的策略方法 HenFeed

Java代码 复制代码收藏代码
  1. packagecom.longweir.strategy;
  2. //具体的策略角色--喂养母鸡
  3. publicclassHenFeedimplementsFowlFeed
  4. {
  5. publicHenFeed(){
  6. }
  7. //喂养母鸡的策略方法
  8. publicvoidfeed(){
  9. System.out.println("喂母鸡吃谷物和米粒");
  10. }
  11. }

以上都实现了三个角色的代码,我们编写一个客户端代码来测试下:

Java代码 复制代码收藏代码
  1. /*------------------------------------------------------------------------------------*/
  2. //客户端的调用示例
  3. packagecom.longweir.strategy;
  4. publicclassStrategy
  5. {
  6. publicstaticvoidmain(String[]args){
  7. //实例化一个环境角色feeder
  8. Feederfeeder=newFeeder(newRabbitFeed());
  9. //喂养兔子
  10. feeder.feedInterface();
  11. //喂养猪
  12. feeder.setFowlFeed(newPigFeed());
  13. feeder.feedInterface();
  14. //喂养母鸡
  15. feeder.setFowlFeed(newHenFeed());
  16. feeder.feedInterface();
  17. }
  18. }

执行结果是:

Java代码 复制代码收藏代码
  1. 喂兔子吃青菜和萝卜
  2. 喂猪吃糠和泔水
  3. 喂母鸡吃谷物和米粒

在客户端中,针对不同的具体策略类,环境角色执行了不同的策略方法。 当我们日后需要增加新的策略时,我们只需要新建一个具体的策略类来实现抽象策略接口即可。例如系统中,饲养员新饲养了禽类为山羊(Goat)

则代码日下:

Java代码 复制代码收藏代码
  1. packagecom.longweir.strategy;
  2. /*
  3. 具体的策略角色类--喂养山羊的策略方法
  4. */
  5. publicclassGoatFeedimplementsFowlFeed
  6. {
  7. publicGoatFeed(){}
  8. //喂养山羊的策略方法,实现抽象策略中的方法
  9. publicvoidfeed(){
  10. System.out.println("喂山羊吃青草");
  11. }
  12. }

然后我们的客户端中就可以很方便的调用,这样一来实现了系统的扩展。但是,很明显的是,如果重复使用策略,则不可行。重复的使用,我们可以使用装饰器模式来解决.

分享到:
评论

相关推荐

    策略模式-java

    策略模式(java),详细介绍了面向对象开发常用模式之一-策略模式,详解了其原理,并经过详细的例子进行演示,通过一个完整的代码演示,让你完全理解策略模式思想,资源好不好下了就知道,感觉不好,亏了你的分,骂...

    辉芒微单片机资料和手册,及软件工具

    能学到什么:①工厂模式、策略模式、观察者模式等都是怎么在Spring中体现的;②IOC、AOP、代理、切面、循环依赖都是如何设计和实现的。 阅读建议:此资源以开发简化版Spring学习其原理和内核,不仅是代码编写实现也...

    [编译原理].陈意云.文字版

    本书介绍编译器构造的一般原理和基本实现方法,主要内容包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等。除了介绍命令式编程语言的编译技术外, 本书还介绍面向对象语言和函数式编程语言...

    编译原理全套

    2.1.1 词法记号、模式、词法单元 2.1.2 词法记号的属性 2.1.3 词法错误 2.2 词法记号的描述与识别 2.2.1 串和语言 2.2.2 正规式 2.2.3 正规定义 2.2.4 状态转换图 2.3 有限自动机 2.3.1 不确定的有限自动机 ...

    二十三种设计模式【PDF版】

    设计模式之 Template(模板方法) 实际上向你介绍了为什么要使用 Java 抽象类,该模式原理简单,使用很普遍. 设计模式之 Strategy(策略) 不同算法各自封装,用户端可随意挑选需要的算法. 设计模式之 Chain of ...

    asp.net知识库

    Microsoft .NET策略及框架概述 卸载Class? Web Form 窗体 如何实现web页面的提示保存功能 在ASP.Net中两种利用CSS实现多界面的方法 如何在客户端调用服务端代码 页面一postback,它就显示页面的最顶端,怎样让它定位...

    精通qt4编程(源代码)

    QMainWindow 卢传富 Qt应用程序的主窗口是由多个部件/组件构成的框架,本章通过一个简单文本编辑器的例子,介绍了主窗口的菜单、工具条、中心部件、锚接部件和状态条,并通过Qt设计器绘制和手写代码两种方法实现了...

    精通Qt4编程(第二版)源代码

    QMainWindow 卢传富 Qt应用程序的主窗口是由多个部件/组件构成的框架,本章通过一个简单文本编辑器的例子,介绍了主窗口的菜单、工具条、中心部件、锚接部件和状态条,并通过Qt设计器绘制和手写代码两种方法实现了...

    编程新手真言......

    8.15 真正的策略模式 185 8.16 真正的观察者模式 185 8.17 真正的装饰模式 186 8.18 真正的单例模式 186 8.19 真正的迭代器模式 186 8.20 真正的工厂模式 187 8.21 真正的门面模式 187 8.22 真正的命令模式 188 8.23...

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    1.2. 第一个例子:注册示例.............................................................................................................................................. 15 1.2.1. 了解代码.................

    McGraw C++程序调试实用手册

    l.5.3 结构图、伪代码及IPO框图 l.6 好的程序设计的五点要素 1.7 规则意味着可以打破 1.7.1 安塞尔亚当斯(Ansel Adams)或毕加索(Picasso) 1.7.2 注释块 1.7.3 标识符:identifiers、IDENTIFIERS和...

    庖丁解牛纵向切入ASP.NET 3.5控件和组件开发技术.pdf

     本书主要介绍asp.net的控件开发,书中通过70多个例子讲解了asp.net控件开发技术的各个方面,而且剖析了很多控件中系统基类源代码,读者从这些系统源代码可以体会设计模式思想。如果扎实地掌握了asp.net控件的运行...

    Flink CEP兵书

    Flink CEP兵书全面系统的介绍Flink CEP...分别讲解了:Flink CEP与流式处理的区别、原理、api讲解、Flink CEP各种模式、跳过策略、模式匹配、水位线的讲解等内容。以及在代码例子中,给大家提供了代码实现及代码讲解。

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段07讲、策略模式在Thread和Runnable中的应用分析.mp4 │ 高并发编程第一阶段08讲、构造Thread对象你也许不知道的几件事.mp4 │ 高并发编程第一阶段09讲、多线程与JVM内存结构的关系,虚拟机...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段07讲、策略模式在Thread和Runnable中的应用分析.mp4 │ 高并发编程第一阶段08讲、构造Thread对象你也许不知道的几件事.mp4 │ 高并发编程第一阶段09讲、多线程与JVM内存结构的关系,虚拟机...

    Hadoop实战(第2版)

    大数据模式4 处理大数据的MapReduce 模式4.1 Join4.1.1 Repartition Join技术点19 优化repartition join 4.1.2 Replicated Join 4.1.3 Semi-join技术点20 实现semi-join4.1.4 为你的数据挑选最优的...

    php网络开发完全手册

    5.7.1 策略模式(Strategy Pattern) 81 5.7.2 单例模式(Singleton Pattern) 81 5.7.3 工厂模式(Factory Pattern) 83 5.8 接口与抽象类 86 5.8.1 接口的定义 86 5.8.2 单一接口的实现 87 5.8.3 多重接口的实现 ...

    《软件工程导论》张海潘_第五版_清华_课后答案

    1.2.2 软件工程的基本原理7 1.2.3 软件工程方法学9 1.3 软件生命周期11 1.4 软件过程14 1.4.1 瀑布模型15 1.4.2 快速原型模型16 1.4.3 增量模型17 1.4.4 螺旋模型19 1.4.5 喷泉模型21 1.4.6 Rational统一过程22 ...

    C++书籍集合

    大多时候,一些初学者不知道应该读什么书入门,有一定基础的开发者不知道如何进阶。...本书提供了一些针对软件设计的前沿方法,如联合设计模式、泛型编程,使程序员可以编写有表现力的、灵活的、高度可重用的代码。

Global site tag (gtag.js) - Google Analytics