Well, in my humble experience, I've seen and used something called PAC :
Presentation - Abstraction - Control
The two main ideas are :
- To decorrelate the Presentation (ui
rendering / user events) from the
abstraction (your processing : data
access, object model, hardware, IO,
...) by using a controller that
manage the link between those two
parts.
- To manage a hierarchical tree of
agents where an agent is a
Presentation module, an Abstraction
module and the controller module.
In concrete implementation, Presentation modules translate low level UI event to application events, the controller manage the flow of events to the higher level. Some events go to some manager that dispatch them to the processing part of the application (Abstraction).
This way :
- The UI part is cleanly separated from
the processing / abstraction part.
You can change the UI, use a GUI and
a text UI, a TCP/IP command UI, ...
- The hierachical organisation of UI
agents maps to your UI elements which
you can reuse in many different
applications.
Of course a lot of others patterns are use but this main architecture is the key for reusing UI modules and of course processing/business modules.
EDIT:
I've retrieved a great article on UI architecture comparing different kind of architecture, including PAC :
a must read for UI/application architect