java - 多态性与策略模式

标签 java design-patterns polymorphism strategy-pattern

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/

相关文章:

用于在方法调用中显式指定泛型参数的 Java 语法

java - Spring BeanCreationException 错误

c# - 我怎样才能让父类知道注入(inject)类的变化

javascript - (使用 Javascript 对象进行实验)为什么我的函数在另一个函数中不起作用?

Java-多态性 : legal vs illegal declarations

java - 我可以在构造函数中传递多个 Super 调用吗?

java - 如何创建不同模型的 JTable?

php - 我可以将 MVC 设计模式应用于过程 PHP

c++ - Barton-Nackman 技巧中使用的 C++ 非模板成员是什么?

c++ - '{' token 之前的预期类名 - 带有头文件和 cpp 文件