gpt4 book ai didi

java - 多态性与策略模式

转载 作者:IT老高 更新时间:2023-10-28 20:50:55 26 4
gpt4 key购买 nike

Strategy模式和Java中的多态有什么区别?

我很困惑,通过策略模式实现的任何事情基本上都可以通过多态性实现。如果我在这方面错了,请纠正我。

请也给我举个例子来消除我的困惑。

最佳答案

对我来说,来自 的链接 CKing 帖子和维基百科中的示例已经很清楚了,但我会尝试给您一个新的示例。正如他们所说,策略模式主要是一种在运行时改变算法行为的方法。当然,您可以通过许多不同的方式来实现这一点(例如持有一个值和使用 switch-case,但它不如策略模式那么好)。

假设您正在开发一款包含两种单位的回合制策略游戏:步兵坦克(单位的子类) .您的地形可以是平原铁路森林

class Unit{
MovementStrategy ms;
final int baseMovement;
int x,y;

public Unit(int baseMovement){
this.baseMovement = baseMovement;
}

abstract void fire();

void moveForward(){
x = x + ms.getHexagonsToMove(baseMovement);
}

void setMovementStrategy(MovementStrategy ms){
this.ms = ms;
}
}

任何 Unit 子类都必须实现 fire() 方法,因为 这对他们来说将是完全不同的(坦克射击重型长距 ionic 弹,步兵射击几个短距离轻型子弹)。在这个例子中,我们使用普通的多态性/继承,因为 fire() 方法对于任何单位来说都是不同的,并且在游戏过程中不会改变

class Infantry extends Unit{
public Infantry(){
super(2);
}

void fire(){
//whatever
}
}

class Tank extends Unit{
public Tank(){
super(5);
}

void fire(){
//whatever
}
}

单位也可以移动,并且有一个字段 baseMovement 保存它可以行走的六边形数量。我们正在开发一个策略游戏,而不是真实世界的模拟,所以我们不关心他们如何移动,我们只是想为他们的坐标添加一个值(在我的示例中,我只使用 X 坐标以获得更简单的代码)。如果所有地形都相同,我们就不需要任何 Strategy 对象...但是我们需要在运行时更改 move() 方法的行为!

因此,我们为每种地形实现了不同的 MovementStrategy 类,并且我们对游戏进行了编程以触发 setMovementStrategy() 到任何移动的单元每个六边形。而且我们甚至不需要在 Unit 子类中编写任何其他内容。

interface MovementStrategy{
public int getHexagonsToMove(int base);
}

class PlainMovementStrategy implements MovementStrategy{
public int getHexagonsToMove(int base){
return base;
}
}

class RailroadMovementStrategy implements MovementStrategy{
public int getHexagonsToMove(int base){
return base*3;
}
}

class ForestMovementStrategy implements MovementStrategy{
public int getHexagonsToMove(int base){
return (int)(base/2);
}
}

现在,当任何 UnitForest 内移动时,我们调用

unit.setMovementStrategy(new ForestMovementStrategy());

一旦进入平原,我们就会这样做:

unit.setMovementStrategy(new PlainMovementStrategy());

现在我们可以根据地形改变单位移动的距离,并且我们不需要在任何子类中重写。

我希望这可以帮助您更好地了解差异。

关于java - 多态性与策略模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31608902/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com