Before, the ChessGame class had separate methods for each piece, making it hard to add new pieces or change behavior. After applying polymorphism, each piece class implements its own move method. The Strategy pattern allows selecting different move behaviors dynamically, improving flexibility and maintainability.
### Before: No polymorphism or strategy
class ChessGame:
def move_pawn(self, position):
# specific pawn move logic
pass
def move_knight(self, position):
# specific knight move logic
pass
### After: Using polymorphism and strategy
from abc import ABC, abstractmethod
class Piece(ABC):
@abstractmethod
def move(self, position):
pass
class Pawn(Piece):
def move(self, position):
# pawn-specific move logic
print(f"Pawn moves to {position}")
class Knight(Piece):
def move(self, position):
# knight-specific move logic
print(f"Knight moves to {position}")
class MoveStrategy(ABC):
@abstractmethod
def select_move(self, piece, position):
pass
class AggressiveStrategy(MoveStrategy):
def select_move(self, piece, position):
print("Aggressive move selected")
piece.move(position)
class DefensiveStrategy(MoveStrategy):
def select_move(self, piece, position):
print("Defensive move selected")
piece.move(position)
# Usage
pawn = Pawn()
knight = Knight()
strategy = AggressiveStrategy()
strategy.select_move(pawn, "E4")
strategy = DefensiveStrategy()
strategy.select_move(knight, "F6")