象棋子 设计模式_通过设计国际象棋游戏了解策略模式

象棋子 设计模式

今天,我们将借助一个示例来尝试了解策略模式。

我们将考虑的示例是国际象棋游戏。 这里的目的是解释策略模式,而不是构建全面的国际象棋游戏解决方案。

策略模式:策略模式被称为行为模式–用于管理对象之间的算法,关系和职责。 策略模式的主要好处是在运行时选择算法/行为。



策略模式

让我们尝试通过实现设计棋盘游戏来理解这一点。

在国际象棋中,有不同的角色,例如国王,皇后,主教,并且所有角色都有不同的动作。 此设计可能有许多解决方案,让我们一个一个地探索:

  1. 第一种方法是在每个类中定义运动,每个字符都有其自己的move()实现。 这样,就没有代码可重用性,并且我们无法在运行时更改实现。
  2. 制作一个单独的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

象棋子 设计模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值