策略模式

提起强大的Java,脑海里总会蹦出几个关键字,封装,继承,多态,一处编译处处运行,代码复用等等,而设计模式在我的学习中认为是前人经验的复用,从而让Java写出来的系统更加的具有延展性,以应变后面需求的变化.今天要学习的就是策略模式.

有一个国家人员复杂,管理起来麻烦,此时他历经千辛万苦找到了你,在随从的侍卫放下两大箱的黄金之后,请求你为国家设计一个人员管理系统,但在此之前他需要考量一下你, 假设有如此需求,这是一个尚武的国家,有剑客,弓箭手,战士(使用斧头)等,此时需要你写一个小的demo来管理各自人员的战斗方式.

为了尽早拿下这个项目,于是咖啡都没有冲,你就自信的选择了继承来实现;

1,首先定义抽象父类,将fight()的方式留给子类来实现

父类Role

publicabstractclass Role {

protected String name;

protected Integer age;

protectedvoid breath(){

System.out.println("我们都呼吸空气");

}

protectedabstractvoid fight();

}

子类1,弓箭手

publicclass BowMan extends Role{

@Override

protectedvoid fight() {

System.out.println("我是弓箭手,我的武器是弓箭!");

}

}

子类2,剑客

publicclass SwordMan extends Role{

@Override

protectedvoid fight() {

System.out.println("我是剑客,我的武器是剑!");

}

}

子类3,战士

public class WarriorMan extendsRole{

@Override

protectedvoid fight() {

System.out.println("我是战士,我的武器是斧头!");

}

}

定义测试类:

public class RoleTest {

@Test

publicvoid test4RoleExtends(){

Role role1 = new BowMan();

Role role2 = new SwordMan();

Role role3 = new WarriorMan();

role1.breath();

role2.breath();

role3.breath();

role1.fight();

role2.fight();

role3.fight();

}

}

测试结果:控制台输出如下:

我们都呼吸空气

我们都呼吸空气

我们都呼吸空气

我是弓箭手,我的武器是弓箭!

我是剑客,我的武器是剑!

我是战士,我的武器是斧头!

我要参加战斗!

我要参加战斗!

我要参加战斗!

你向国外许诺,这个系统足以应付所有的问题,无论来什么样的角色,它都可以完美应对,国王很快将他推向了全民,并且Role的子类越来越多,这个系统完美地运行着,有一天国王突发奇想,没错就是突发奇想,需要选拔一些远攻role去攻克一个难关,国王希望国家里的人来报名,深感Java继承的巨大优势的你嗅到了升官发财三妻四妾的契机,大包大揽的应承了这份工作,悠闲的冲了杯咖啡,修改了Role类

publicabstractclass Role {

protected String name;

protected Integer age;

protectedvoid breath(){

System.out.println("我们都呼吸空气");

}

protectedabstractvoid fight();

//报名参加战斗

protectedvoid regiesterFight() {

System.out.println("我要参加战斗!");

}

}

选拔开始:

publicclass RoleTest {

@Test

publicvoid test4RoleExtends(){

Role role1 = new BowMan();

Role role2 = new SwordMan();

Role role3 = new WarriorMan();

role1.breath();

role2.breath();

role3.breath();

role1.fight();

role2.fight();

role3.fight();

role1.regiesterFight();

role2.regiesterFight();

role3.regiesterFight();

}

}

全民响应战斗:

于是乎,战场上一群扔了斧头和剑就没法再战斗的role,因为这场战斗需要远程投掷.毫无疑问,这场战斗,大败而归,国王大怒,责令你一周之内拿出解决方案,否则剥夺你喝咖啡的权利,没有了咖啡,你就很有可能在代码的海洋中溺死.

此时你想起了尘封了很久的武林秘籍,headfirst之设计模式,哪一个模式才能应付这样行为多变的情况呢,思考了六天,在毫无头绪中度过,第七天终于想起了那根救命稻草---策略模式.

策略模式:

定义算法族,让算法和使用算法的用户分离起来.

将战斗和报名战斗的行为委托出去分别由FightBehavior和RegFightBehavior两个接口(面向接口编程,远远胜于面向实现编程),行为的具体方式由其不同的实现类实现.

重新定义Role

publicabstractclass Role {

protected String name;

protected Integer age;

protected FightBehavior fightBehavior;

protected RegFightBehavior regFightBehavior;

protectedvoid breath(){

System.out.println("我们都呼吸空气");

}

}

定义接口FightBehavior,RegFightBehavior

public interface FightBehavior {

publicvoid fight();

}

其实现类:

public class FightByAxe implementsFightBehavior{

@Override

publicvoid fight() {

System.out.println("我用斧头!!!");

}

}

public class FightByBow implementsFightBehavior{

@Override

publicvoid fight() {

System.out.println("我用弓箭!!!");

}

}

public class FightBySword implementsFightBehavior{

@Override

publicvoid fight() {

System.out.println("我用剑!!!");

}

}

将战斗的行为分离出来,并叫交由其实现类来处理,在role中添加战斗行为属性,而不需要考虑其如何实现的.

public interface RegFightBehavior {

publicvoid regFight();

}

public class RegFightByClose implements RegFightBehavior{

@Override

publicvoid regFight() {

System.out.println("我是近战,我不能参加!!");

}

}

public class RegFightByFar implements RegFightBehavior{

@Override

publicvoid regFight() {

System.out.println("我是远攻我要参加");

}

}

是否参加战斗这一行为也是如此,为了形象的表现将行为委托出去了,将命名变为byFar byClose这种方式.

此时再在role的子类中,定义或者赋予行为类的具体委托类,也就是指定客户使用的算法

publicclass BowMan extends Role{

publicvoidfight(){

fightBehavior = newFightByBow();

fightBehavior.fight();

}

publicvoidregFight(){

regFightBehavior = newRegFightByFar();

regFightBehavior.regFight();

}

}

publicclass SwordMan extends Role{

publicvoidfight() {

fightBehavior = newFightBySword();

fightBehavior.fight();

}

publicvoidregFight(){

regFightBehavior = newRegFightByClose();

regFightBehavior.regFight();

}

}

public class WarriorMan extendsRole{

publicvoid fight() {

fightBehavior= new FightByAxe();

fightBehavior.fight();

}

publicvoid regFight(){

regFightBehavior= new RegFightByClose();

regFightBehavior.regFight();

}

}

测试类

public class RoleTest {

@Test

public voidtest4RoleExtends(){

Rolerole1 = new BowMan();

Rolerole2 = new SwordMan();

Rolerole3 = new WarriorMan();

role1.fight();

role1.regFight();

System.out.println("以上是bowman");

role2.fight();

role2.regFight();

System.out.println("以上是swordman");

role3.fight();

role3.regFight();

System.out.println("以上是warriorman");

}

}

测试结果:

我用弓箭!!!

我是远攻我要参加

以上是bowman

我用剑!!!

我是近战,我不能参加!!

以上是swordman

我用斧头!!!

我是近战,我不能参加!!

以上是warriorman

23中设计模式之策略模式相关推荐

  1. 23种设计模式之命令模式和策略模式的区别

    文章目录 概述 命令模式 策略模式 相同点 总结 概述 命令模式和策略模式确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的 ...

  2. java 23 种设计模式-23-java 策略模式(Strategy Pattern)

    目录 目录 策略模式 实际案例 定义 测试 实现方式 UML & Code UML Code 系列导航 策略模式 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运 ...

  3. C++模式学习------策略模式

    当遇到同一个对象有不同的行为,方法,为管理这些方法可使用策略模式. 策略模式就是对算法进行包装,是把使用算法的责任和算法本身分割开来.通常把一个系列的算法包装到一系列的策略类里面,这些类继承一个抽象的 ...

  4. 设计模式(1)--简单工厂模式、策略模式

    设计模式(1)--简单工厂模式.策略模式 1. 简单工厂模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static ...

  5. 代理模式 委派模式 策略模式_委派模式和策略模式

    一.委派模式 委派模式(Delegate Pattern):指负责任务的调度和分配任务,跟代理模式很像,可以看做是一种特殊情况下的静态代理的全权代理,但是代理模式注重过程,而委派模式注重结果.(属于行 ...

  6. 设计模式之模板方法模式、策略模式、命令模式、责任链模式、状态模式

    前言 本章节给您介绍23种设计模式的行为型模式中的模板方法模式.策略模式.命令模式.责任链模式.状态模式. 如有帮助记得3连 加 关注哦!欢迎品论去留言交流,谢谢阅读! 文章目录 前言 一.模板方法模 ...

  7. Java进阶专题(七) 设计模式之委派模式与策略模式

    一.前言 今天开始我们专题的第七课了.本章节将介绍:你写的代码中是否觉得很臃肿,程序中有大量的if...else,想优化代码,精简程序逻辑,提升代码的可读性,这章节将介绍如何通过委派模式.策略模式让你 ...

  8. 我学的是设计模式的视频教程——命令模式vs策略模式,唠嗑

    课程视频 命令模式vs策略模式 唠嗑 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍 版权声明:本文博主原创文章,博客,未经同意不得转载.

  9. 策略模式和工厂模式的区别_java设计模式之状态模式,策略模式孪生兄弟

    状态模式 状态模式(State Pattern)中,类的行为是基于它的状态改变的,状态之间的切换,在状态A执行完毕后自己控制状态指向状态B,状态模式是不停的切换状态执行.这种类型的设计模式属于行为型模 ...

  10. 委派模式与策略模式综合应用

    在上面的代码中我们列举了非常几个业务场景,相信小伙伴对委派模式和策略模式有了非常深刻的理解了.现在,我们再来回顾一下,DispatcherServlet 的委派逻辑,代码如下: private voi ...

最新文章

  1. FatNet:一个用于三维点云处理的特征关注网络
  2. Python+selenium 自动化-启用带插件的chrome浏览器,调用浏览器带插件,浏览器加载配置信息。
  3. LaTeX在双栏模式下插入跨栏图表
  4. 南京大学计算机考研面试题目,南京大学计算机考研05-07,09年面试题
  5. vue事件委托传递节点防止向下传递穿透
  6. vim中自动添加文件的作者、时间信息、版本等
  7. android webview测速,学习分享,echarts模拟宽带测速效果 附Demo演示地址!!
  8. 11.乘最多水的容器
  9. 让UI设计显得魅力非凡,设计师少不了的渐变背景素材专辑,
  10. Linux安装包下载地址(国内)
  11. Makefile 入门教程
  12. php mysql memcache_php的memcache和memcached扩展区别
  13. 使用phppgadmin 遇到的小问题
  14. 歇后语:有牌不胡偏要杠
  15. To_Heart—题解——POI2012 Rendezvous
  16. 【我的OpenGL学习进阶之旅】什么是PVR文件以及如何打开它?
  17. 浅谈如何在优麒麟22.04中使用Eigenstrat和Plink工具生成类23andMe格式原始数据
  18. OFGP 协议跨链解决方案
  19. 银河麒麟怎么卸载软件_常见问题·银河麒麟操作系统 麒麟操作系统 中标麒麟 麒麟软件官方网站...
  20. SCT9330STER,芯洲3.8V-30V输入,3A降压DCDC,替代TPS54331

热门文章

  1. 一个完整的python项目_一个完整的机器学习项目在Python中的演练(一)
  2. 在线Word文档怎么做—使用超级文档一站式解决
  3. 智能设计课程v2.0 | DesignX 2021版
  4. 数据结构银行排队系统c语言,数据结构银行排队系统实验报告
  5. Python dataframe绘制饼图_Python可视化29|matplotlib-饼图(pie)
  6. 最简单最快速csv超大文件入库并统计Top5
  7. 两台主机如何共享一套键鼠一台显示器?
  8. web前端期末大作业 html+css学生心理 7页主题网页设计
  9. Elasticsearch创建索引
  10. 配置 PO SLD步骤