One of the most important ideas in organizing programs is to
user interface (GUI, presentation, view and controller, ...) from
the logic (model, engine, ...).
There are two really good reasons for this.
The resulting program is conceptually simpler, and this
means it is easier to work on, extend, refactor, understand,
A different user interface or logic model can be added without
affecting the other. For example, imagine that we've written
a game, eg Connect4, and separated the graphical user interface from
the underlying game logic. Why would we want to replace the GUI?
Maybe you want the program to run on
a PDA or phone, which use a related, but different, Java
graphical user interface, Java 2 Micro Edition.
The new GUI can be written without concern for its
affect on the logic model, which can very likely
remain the same.
Perhaps you want to set up a Connect4 server so that
the game could be played over the web, but use only
one master copy of the logic on your server.
There will be no GUI in this case; a server
program like Tomcat or PHP will call on the (unchanged) logic
module and build the appropriate web page to send back
to the user.
A good reason to replace the logic is when you've written
a new version that plays better or more efficiently.
It's hard to see why you might want to replace the
GUI with a text mode interface for a game, but you
might want to do this if you want a program to
run as a Unix batch program.