今天,我们将借助一个示例来尝试了解策略模式。
我们将考虑的示例是国际象棋游戏。 这里的目的是解释策略模式,而不是构建全面的国际象棋游戏解决方案。
策略模式:策略模式被称为行为模式-用于管理对象之间的算法,关系和职责。 策略模式的主要好处是在运行时选择算法/行为。
让我们尝试通过实现设计棋盘游戏来理解这一点。
在国际象棋中,有不同的角色,例如国王,皇后,主教,并且所有角色都有不同的动作。 此设计可能有很多解决方案,让我们一个一个地探索:
- 第一种方法是在每个类中定义运动,每个字符都有其自己的move()实现。 这样就没有代码可重用性,并且我们无法在运行时更改实现。
- 制作一个单独的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