Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多态性与策略模式_Java_Design Patterns_Polymorphism_Strategy Pattern - Fatal编程技术网

Java 多态性与策略模式

Java 多态性与策略模式,java,design-patterns,polymorphism,strategy-pattern,Java,Design Patterns,Polymorphism,Strategy Pattern,Java中的策略模式和多态性之间有什么区别 我感到困惑的是,通过策略模式实现的任何事情基本上都可以通过多态性实现。如果我在这方面错了,请纠正我 请给我举个例子来消除我的困惑。如果你要建立一个类比,其中: 在一种情况下,您有几个可重写的方法 在另一种情况下,您有一个带有多个实现的策略接口 然后不同的是耦合度,在第一种情况下,耦合度非常强,而在第二种情况下,任何外来代码都可以通过贡献其策略实现来参与类的逻辑 我感到困惑的是,通过策略模式实现的任何事情基本上都可以通过多态性实现 没有方向盘你不能开

Java中的
策略
模式和
多态性
之间有什么区别

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


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

如果你要建立一个类比,其中:

  • 在一种情况下,您有几个可重写的方法
  • 在另一种情况下,您有一个带有多个实现的策略接口
然后不同的是耦合度,在第一种情况下,耦合度非常强,而在第二种情况下,任何外来代码都可以通过贡献其策略实现来参与类的逻辑

我感到困惑的是,通过策略模式实现的任何事情基本上都可以通过多态性实现

没有方向盘你不能开车。这并不意味着方向盘就是汽车。类似地,策略模式依赖于多态性,但这并不意味着它们是同一事物

策略模式的目的是促进组合(has-a)的使用,而不是继承(is-a)。您的类不是从超类继承行为,而是在单独的类中定义行为,并且您的类具有对它的引用

就一个例子而言,请看一看做得很好的答案。

考虑一下这个问题

我们有动物和一个战略模式对象来描述它们如何移动。。。 比如说

飞/游/走

考虑到大量动物使用这些方法中的任何一种(即数千种不同的动物飞行),我们需要对许多不同的动物使用相同的代码。该代码应该只存在于一个地方,这样它就很容易更改,并且不会占用任何不必要的空间


在本例中,简单的多态性方法将导致大量代码重复。一种更为复杂的方法是在动物和罗宾之间设置一个中间类,但它没有考虑到动物的运动方式并不是它的真正定义。此外,动物可能有其他策略对象,它们不能通过中间类都是多态的。

对我来说,来自帖子的链接和维基百科中的示例非常清楚,但我将尝试给你一个新的示例。正如他们所说,策略模式主要是一种在运行时改变算法行为的方法。当然,您可以通过许多不同的方式来实现这一点(比如持有一个值并使用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;
    }
}
class Infantry extends Unit{
    public Infantry(){
        super(2);
    }

    void fire(){
        //whatever
    }
}

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

    void fire(){
        //whatever
    }
}
任何单位子类都必须实现fire()方法,因为这对他们来说是完全不同的(坦克发射重远程子弹,步兵发射几发短距离轻子弹)。在本例中,我们使用普通多态性/继承,因为fire()方法对于任何单位都是不同的,它在游戏期间不会改变

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;
    }
}
class Infantry extends Unit{
    public Infantry(){
        super(2);
    }

    void fire(){
        //whatever
    }
}

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

    void fire(){
        //whatever
    }
}
单位也可以移动,并且有一个野战基地移动,可以容纳它可以行走的六边形的数量。我们正在开发一个战略游戏,而不是一个真实世界的模拟,所以我们不关心它们如何移动,我们只想为它们的坐标添加一个值(在我的示例中,我只使用X坐标,以便获得更简单的代码)。如果所有地形都一样,我们就不需要任何战略目标。。。但是我们需要在运行时更改move()方法的行为

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

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);
    }
}   
现在,当任何单位进入森林时,我们调用

unit.setMovementStrategy(new ForestMovementStrategy());
一旦它进入一个平原,我们会:

unit.setMovementStrategy(new PlainMovementStrategy());
现在我们可以根据地形改变我们的单位移动的距离,我们不需要在任何子类中重写

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);
    }
}   

我希望这有助于您更好地理解这种差异。

首先。多态性可能意味着两件不同的事情。最常见的多态性是指多态类型。但是,您要求的是模式

多态代码可以在每次运行时更改自身,而代码的功能保持不变。一个简单的例子是做1+3=4而不是5-1=4。两者都使用不同的代码实现相同的结果。这对于不希望被识别的代码非常有用,例如计算机病毒或加密代码

另一方面,策略模式使用一系列可以互换的算法。翻译文本时可以使用此选项。首先,一些代码决定了语言。如果语言为瑞典语或西班牙语,文本将由同一系列的不同函数translateSwedish()或translateSpanish()处理

总结。多态代码使用不同的代码实现相同的结果。而策略使用不同的代码来实现更好的结果

多态性与策略模式及核心java示例

  • 基本区别:多态性是编程语言的概念,策略模式是其中之一

  • 多态性是为不同类型的实体提供单一接口。
    示例:无论使用何种类型的实际转向机构,方向盘(即界面)都是相同的。也就是说,无论你的汽车是否有手动转向、动力转向,方向盘的工作原理都是一样的