象棋子 设计模式
今天,我们将借助一个示例来尝试了解策略模式。
我们将考虑的示例是国际象棋游戏。 这里的目的是解释策略模式,而不是构建全面的国际象棋游戏解决方案。
策略模式:策略模式被称为行为模式–用于管理对象之间的算法,关系和职责。 策略模式的主要好处是在运行时选择算法/行为。
让我们尝试通过实现设计棋盘游戏来理解这一点。
在国际象棋中,有不同的角色,例如国王,皇后,主教,并且所有角色都有不同的动作。 此设计可能有许多解决方案,让我们一个一个地探索:
- 第一种方法是在每个类中定义运动,每个字符都有其自己的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
方法。
同样,另一个字符皇后可以定义为:
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 {
@Override
public String move() {
return "move one step forward";
}
}
对角运动:
public class DiagonalMovement implements MovementBehaviour {
@Override
public String move() {
return "Moving Diagonally";
}
}
通过这个例子,我们可以理解策略模式。
翻译自: https://www.javacodegeeks.com/2014/10/understanding-strategy-pattern-by-designing-game-of-chess.html
象棋子 设计模式