The Strategy Pattern is one of the 23 original
software design patterns, which are solutions to programming problems that automatically implement good design techniques. Design patterns extend OOP.
The idea behind the Strategy Pattern is to extract code that handles specific tasks from the application and choose (even at runtime) which algorithms you want to work with. You do this by creating a family of algorithms that implement an interface, customizing code by creating composites of objects and using polimorphism to choose the object you want to work with. The code included in my previous message illustrates this.
The code that I want to extract from the application is the method computerMove(), so I created a family of algoritms (interface PlayStrategy) and provided each Player instance with a private variable representing the strategy (object composition). Polimorphism ensures that each player uses its own strategy, though both invoke the same method: computerMove().
Now if you want to define your own strategy, all you have to do is provide an implementation of the interface PlayStrategy. This could be ranging from choosing squares randomly to some sophisticated AI heuristics, going through implementing if/else statements to check the squares.
This is only the pattern. The real work starts from here. If I end up with some interesting solution, I will upload it here:
http://code.google.com/p/practicaljava/
I like your idea of using radio buttons to select alternative ways of playing the game, I will try that myself.