今天,我们将借助一个示例来尝试了解策略模式。

我们将考虑的示例是国际象棋游戏。 这里的目的是解释策略模式,而不是构建全面的国际象棋游戏解决方案。

策略模式:策略模式被称为行为模式-用于管理对象之间的算法,关系和职责。 策略模式的主要好处是在运行时选择算法/行为。

让我们尝试通过实现设计棋盘游戏来理解这一点。

在国际象棋中,有不同的角色,例如国王,皇后,主教,并且所有角色都有不同的动作。 此设计可能有很多解决方案,让我们一个一个地探索:

  1. 第一种方法是在每个类中定义运动,每个字符都有其自己的move()实现。 这样就没有代码可重用性,并且我们无法在运行时更改实现。
  2. 制作一个单独的MovementController类,并为每种类型的对象放置一个if否则。
public class BadDesginCharacterMovementController {public void move(Character character){if(character instanceof King){System.out.print("Move One Step forward");}else if(character instanceof Queen){System.out.print("Move One Step forward");}else if(character instanceof Bishop){System.out.print("Move diagonally");}}
}

这是一个较差的设计,具有很强的耦合性,而且使用if / else使其难看。

因此,我们希望有一个设计,在其中我们可以有松散的耦合,可以在运行时决定运动算法,并且可以重复使用代码。

让我们看看使用策略模式的完整实现。

下面是我们的实现的类图:

  • 完整的源代码可以从这里下载。

我们将有一个基本的抽象类作为Character Class,所有的角色都可以扩展并设置自己的MovementBehaviour实现。

public class Character {private MovementBehaviour movementBehaviour;String move(){return movementBehaviour.move();}public void setMovementBehaviour(MovementBehaviour movementBehaviour) {this.movementBehaviour = movementBehaviour;}
}

这个班级有一个运动行为:

public interface MovementBehaviour {String move();
}

因此,每个角色:国王,女王,主教都将扩展角色,并且他们可以有自己的运动行为实现。

public class King extends Character {public King() {setMovementBehaviour(new SingleForward());}
}

为了简单起见,在这里,我在King的构造函数中调用了setMovemementBehaviour方法。

同样,另一个字符Queen可以定义为:

public class Queen extends Character {public Queen() {setMovementBehaviour(new SingleForward());}
}

并且,Bishop为:

public class Bishop extends Character {public Bishop() {setMovementBehaviour(new DiagonalMovement());}
}

不同动作的实现可以如下:

单向前进:

public class SingleForward implements MovementBehaviour {@Overridepublic String move() {return "move one step forward";}
}

对角运动:

public class DiagonalMovement implements MovementBehaviour {@Overridepublic String move() {return "Moving Diagonally";}
}

通过这个例子,我们可以理解策略模式。

翻译自: https://www.javacodegeeks.com/2014/10/understanding-strategy-pattern-by-designing-game-of-chess.html

通过设计国际象棋游戏来了解策略模式相关推荐

  1. 中国象棋_通过设计国际象棋游戏来了解策略模式

    中国象棋 今天,我们将借助一个示例来尝试了解策略模式. 我们将考虑的示例是国际象棋游戏. 这里的目的是解释策略模式,而不是构建全面的国际象棋游戏解决方案. 策略模式:策略模式被称为行为模式–用于管理对 ...

  2. 象棋子 设计模式_通过设计国际象棋游戏了解策略模式

    象棋子 设计模式 今天,我们将借助一个示例来尝试了解策略模式. 我们将考虑的示例是国际象棋游戏. 这里的目的是解释策略模式,而不是构建全面的国际象棋游戏解决方案. 策略模式:策略模式被称为行为模式–用 ...

  3. 「补课」进行时:设计模式(11)——游戏中的策略模式

    1. 前文汇总 「补课」进行时:设计模式系列 2. 游戏中的策略模式 我是一个很喜欢玩游戏的人,周末在家打打游戏是真的很开心. 回想起来当年上大学的往昔峥嵘岁月,那时候基本上是一个人在玩游戏,背后围着 ...

  4. 【Head First 模式设计】第1章 策略模式

    Intro to Design Patterns Welcome to Design Patterns SimUDuck应用程序 一个模拟鸭子游戏:SimUDuck.游戏中会出现各种鸭子,一边游泳,一 ...

  5. 游戏设计模式之策略模式(二)

    今天来讲一下策略模式. 在我们进行游戏开发的时候,总避免不了改动自己的算法.特别是你做完一个功能之后,策划跑来跟你说,我觉得我们还可以加一个功能(这个功能跟前一个功能类似),第一次过来跟你说要加,那自 ...

  6. [策略模式]在游戏开发中的应用

    设计模式中的每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心.这样,你就能一次又一次地使用该方案而不必做重复劳动. 设计模式在类间关系这个粒度上给出常见问题的解决方案.属于 ...

  7. 设计模式- 策略模式

    在开始说设计模式之前,让我们先聊点别的东西,相信每个人都有自己难忘的童年时光,在那时有很多有趣好玩的事物陪伴着我们.我记得小时候,很喜欢看一部动画片--<四驱兄弟>,,,好吧暴露年纪了.. ...

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

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

  9. 设计模式四:策略模式

    策略模式 所谓策略其实就是做一件事情有很多很多的方法,比如说一个商场要搞促销,促销的方式有可能有很多:打折啊,满100返50啊.积分等等之类的.这种不同的促销方式在我们系统中表示就是一个一个的策略,并 ...

最新文章

  1. Saltstack自动化环境部署
  2. 【学习笔记】Python - tkinter
  3. USB3.0超高速接口应用方案
  4. 关于J2EE中死锁问题的研究(2)
  5. s2-045 java_S2-045漏洞初步分析
  6. 对渠道流量异常情况的分析
  7. 圆周率π的计算历程及各种脑洞大开的估计方法
  8. debian6安装后中文乱码
  9. bzoj 4033: [HAOI2015]树上染色(树形DP)
  10. 去哪儿app_58款APP遭点名,多家基金、银行产品上榜!
  11. VC9.VC10.VC11...各对应什么版本的VS,以及含义
  12. mysql2008安装失败_SQL Server 2008 安装失败问题总结
  13. 计算机出现函数不正确的是,小编教你快速修复无法访问函数不正确的方法
  14. c语言ld怎么声明,ld C语言编程开发
  15. Android系统定位获取经纬度
  16. java 简单考试系统 ——java程序设计
  17. 03 【前端笔试】- 2020 搜狗校招笔试题
  18. RobotStudio 建立机器人模型和虚拟示教器的使用
  19. 基层管理者项目管理二三事
  20. 简易kafka消息服务器搭建

热门文章

  1. 变量的分类(按数据类型)
  2. 文件内容查看---Linux
  3. php accesscontrolalloworigin,设置Access-Control-Allow-Origin实现跨域访问
  4. myeclipse窗口布局控件任意_木辛老师的编程课堂:Python和Qt第2讲之布局管理初探(三)...
  5. windows监控txt写入_Windows的bug们
  6. java泛型程序设计——翻译泛型表达式+翻译泛型方法
  7. 常见的并发模型_两个常见的并发错误
  8. jdk9与jdk11哪个好_JDK 9、10和11中的安全性增强
  9. 应用程序缓存_应用程序模块和实体缓存
  10. 美图手机投射功能在哪_在Java 8中进行投射(还有其他功能?)