1. Separate interface design from internals
  2. Enable multiple user-interface strategies
  3. Enable multiple-platform support