Java 多态性与策略模式
Java中的Java 多态性与策略模式,java,design-patterns,polymorphism,strategy-pattern,Java,Design Patterns,Polymorphism,Strategy Pattern,Java中的策略模式和多态性之间有什么区别 我感到困惑的是,通过策略模式实现的任何事情基本上都可以通过多态性实现。如果我在这方面错了,请纠正我 请给我举个例子来消除我的困惑。如果你要建立一个类比,其中: 在一种情况下,您有几个可重写的方法 在另一种情况下,您有一个带有多个实现的策略接口 然后不同的是耦合度,在第一种情况下,耦合度非常强,而在第二种情况下,任何外来代码都可以通过贡献其策略实现来参与类的逻辑 我感到困惑的是,通过策略模式实现的任何事情基本上都可以通过多态性实现 没有方向盘你不能开
策略
模式和多态性
之间有什么区别
我感到困惑的是,通过策略模式实现的任何事情基本上都可以通过多态性实现。如果我在这方面错了,请纠正我
请给我举个例子来消除我的困惑。如果你要建立一个类比,其中:
- 在一种情况下,您有几个可重写的方法李>
- 在另一种情况下,您有一个带有多个实现的策略接口
在本例中,简单的多态性方法将导致大量代码重复。一种更为复杂的方法是在动物和罗宾之间设置一个中间类,但它没有考虑到动物的运动方式并不是它的真正定义。此外,动物可能有其他策略对象,它们不能通过中间类都是多态的。对我来说,来自帖子的链接和维基百科中的示例非常清楚,但我将尝试给你一个新的示例。正如他们所说,策略模式主要是一种在运行时改变算法行为的方法。当然,您可以通过许多不同的方式来实现这一点(比如持有一个值并使用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示例
- 基本区别:多态性是编程语言的概念,策略模式是其中之一
- 多态性是为不同类型的实体提供单一接口。
示例:无论使用何种类型的实际转向机构,方向盘(即界面)都是相同的。也就是说,无论你的汽车是否有手动转向、动力转向,方向盘的工作原理都是一样的