设计模式实例学习-策略模式

原创博客,转载请注明出处:
http://blog.csdn.net/u011035622/article/details/49745553

    此前在某公司面试时,面试官问我说有没有自己写什么东西分享,我说有一些,但是很多东西发现别人都写过了,自己慢慢就不太想再写了。他跟我说让我继续坚持写,总会有好处的。后来也知道,写博客有时候也许不一定是分享,也可以是对自己学习的总结,加深印象。秋招对于我,其实在10月末就已经结束了,休息一阵,不敢颓废,现在打算开始写些东西记录自己的学习过程。

定义

(行为模式)

   策略模式,我的理解就是通过将算法策略分别封装起来,面向接口实现,达到可以动态替换不同的算法,改变策略的目的。

此模式让算法的变化独立于使用算法的客户!


实例分析

  • 抽象策略:两个接口
    分别设置学生专业、学生社团

Profession.java

package Strategy;interface Profession {//专业public void learning();
}

Club.java

package Strategy;interface Club{//社团public void playing();
}
  • 学生类

Student.java

package Strategy;public class Student {private Profession mProfession;private Club mClub;public void setProfession(Profession mProfession){//传入具体策略类(专业)this.mProfession = mProfession;}public void setClub(Club mClub){//传入具体策略类(社团)this.mClub = mClub;}public void makeIntroduction(){//作个自我介绍mProfession.learning();mClub.playing();}
}

可以看到,student类中有两个内部的接口,分别用于策略的设置实现。事实上经常写回调接口的话,这个东西一看也很容易知道。

  • 在Main中测试实现。

另外为了方便,我实现接口的具体策略类也放到了这里面=。=

package Strategy;public class Main {public static void main(String[] args) {Student hww = new Student();hww.setProfession(new CommunicationsPro());hww.setClub(new InformationClub());hww.makeIntroduction();System.out.println("\n____把每个专业或社团当做一种策略算法,面向接口来设置对应的具体策略,可以动态更改____\n");hww.setProfession(new PhysicsPro());hww.setClub(new StudentUnioClub());hww.makeIntroduction();}
}/*以下均为具体策略类——————————————————
*/class CommunicationsPro implements Profession{//通信专业@Overridepublic void learning() {System.out.println("通信专业什么都搞。。");}
}
class PhysicsPro implements Profession{//物理专业@Overridepublic void learning() {System.out.println("专心学物理。");}
}
class ChemistryPro implements Profession{//化学专业@Overridepublic void learning() {System.out.println("专心学化学。");}
}
class InformationClub implements Club{//信息中心社团@Overridepublic void playing() {System.out.println("玩视频编辑,做海报,组织各种活动。");}
}
class DebateClub implements Club{//辩论社团@Overridepublic void playing() {System.out.println("打辩论赛。");}
}
class StudentUnioClub implements Club{//校学生会@Overridepublic void playing() {System.out.println("开会。再开会。继续开会。");}
}
  • 输出:
通信专业什么都搞。。
玩视频编辑,做海报,组织各种活动。____把每个专业或社团当做一种策略算法,面向接口来设置对应的策略,可以动态更改____专心学物理。
开会。再开会。继续开会。

实例如期输出。


策略模式优缺点

优点就是弹性强,算法独立于客户,更改算法不用对客户类进行修改,减少修改功能时对整体的代码的影响,而且能够动态的对算法策略进行修改。

.

缺点是每多一种算法,类增加一个,导致类数量众多,且客户需要了解所有策略类的功能,自行对选择实现策略进行判断。可以通过结合工厂方法、代理或享元模式弥补这个缺点


策略模式的使用场景

  1. 多个类只有在算法或行为上有所不同。
  2. 需要动态设置算法行为时。
  3. 需要屏蔽具体的算法细节时。

设计模式实例学习-策略模式相关推荐

  1. Java设计模式之策略模式与状态模式

    一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...

  2. 换个姿势学设计模式:策略模式

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:公众号「闻人的技术博客」 前言 前段时间,接到一个 ...

  3. 研磨设计模式之 策略模式--转

    http://www.uml.org.cn/sjms/201009092.asp 研磨设计模式之 策略模式   2010-09-09 作者:云飞龙行 来源:云飞龙行的blog   先感谢众多朋友的支持 ...

  4. 设计模式:策略模式(Strategy)

    定   义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...

  5. C++设计模式之策略模式(Strategy)

    Strategy策略模式 作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. UML图: 代码实现 #include <iostream& ...

  6. python策略模式包含角色_详解Python设计模式之策略模式

    虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中"不见了,或者简 ...

  7. 一篇博客读懂设计模式之-----策略模式

    设计模式之策略模式 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的对象 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 主要解决:在有多种算法相似的情况下 ...

  8. 面向对象设计模式之策略模式

    面向对象设计模式之策略模式 1.策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户 2.抽象鸭子类,鸭子飞行行为在此处类似于算法族 1 package ...

  9. java策略模式详解_Java经典设计模式之策略模式原理与用法详解

    本文实例讲述了Java经典设计模式之策略模式.分享给大家供大家参考,具体如下: 策略模式指:策略模式指将程序中可变部分抽象分离成一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式 ...

  10. 策略设计模式_设计模式之策略模式总结

    再上一篇文章<设计模式之策略模式>中,我们通过模拟鸭子项目,了解了什么是策略模式,怎么使用策略模式.本文将通过鸭子项目的学习,对策略模式进行总结. 策略模式: 分别封装行为接口,实现算法族 ...

最新文章

  1. Division and Union CodeForces - 1101C (排序后处理)
  2. 几种经典的数据排序及其Java实现
  3. fb静态区域_fb 静态数据
  4. Oracle开启关闭归档日志
  5. JavaScript学习笔记(九)--内置函数
  6. 数据库工作笔记017---还记得Oracle悲观锁和乐观锁嘛?以及hibernate对乐观悲观锁的封装
  7. Win11推送如何操作 Windows11推送的详细步骤方法
  8. 13.深入分布式缓存:从原理到实践 --- 缓存在社交网络Feed系统中的架构实践
  9. 2021-10-18word2vec训练过程
  10. Redis和MySQL保持数据一致性
  11. C程序10 自由落体
  12. 【python教程入门学习】Python转义字符及用法
  13. 思科实验4.4.1.2-Packet Tracer - 综合技能练习
  14. Android 手机红外遥控器实现
  15. Android8.0 悬浮窗的实现
  16. 商城项目18_esMapping字段映射、常用类型、数据迁移、ik分词器、自定义分词器
  17. 基于ArduinoUNO的LD3320语音识别+SYN6288语音合成的智能分类垃圾桶
  18. 【Python】霍兰德人格分析雷达图
  19. Java中Cookie详解
  20. 《大话设计模式》php版本

热门文章

  1. Android 手机震动提示效果 Android Vibrator 手机震动
  2. 基于Boost.Asio的异步编程
  3. linux unlink 函数,linux – unlink和rm有什么区别?
  4. Thinkpad X61驱动下载及安装方法 for windows XP
  5. 【智能家居】空调遥控器破解
  6. P1930 亚瑟王的宫殿
  7. 参考TLC5615基于verilog HDL实现SPI时序
  8. vscode eslint beautify 格式化 html
  9. 计算机鼠标双击怎么,鼠标双击变成属性怎么办 鼠标双击变成属性解决办法【详解】...
  10. java文章采集爬虫代码示例