title: Alternatives to a deep & narrow inheritance hierarchy?
body: <p>(Novice Java developer here, any responses would be greatly appreciated.)</p>
  
  <p>I have created an implementation of a game, and several different AI's that play it. Lets say they all use the same base algorithm, something like Monte-Carlo Tree Search (MCTS). All of the AI's share this common template, but they all have slight differences. Each AI must contain the previous AI's modifications as I must demonstrate my progress.</p>
  
  <p>Currently, I have an interface which defines the required methods of MCTS and an abstract class which defines implementations of these methods to perform vanilla MCTS (Unoptimised). The first AI I created extends this abstract class to define a concrete version. Then the next AI extends the first and overrides certain methods to modify the algorithms behaviour in some way. This kind of process is repeated so each AI extends the previous one, gaining previous alterations and defining its own.</p>
  
  <p>This creates a deep and narrow like inheritance hierarchy, which has a consequence of being hard to understand. Is there a better way to create these AI's and change the inheritance hierarchy?</p>