GUIアプリケーションを開発するにあたっては、MVCというパターンが使えます。
このパターン、モデルでどこまで表現するのか、コントローラの責務はどこまでとするか、といったあたりが議論になったりするのですが、純粋に必要な責務を3分割するというのが難しいので、なかなかすっきりとしないという問題があります。
ビューとモデルは明確に分けることができるので、Observerパターンとして独立して説明をすることができるのですが、ビューで表示されている部品から入力をうけつけるようなアプリケーションでは、やはりコントローラとビューをつなげないといけなくて、すっきりとしません。
JavaのSwingなんかは、GUI部品はビューとコントローラの責務を持つという前提で、モデルはGUI部品のコンストラクタでセットするなり、GUI部品のインスタンスつくってからモデルをセットするなり、といった方式になっています。GUIでのイベントについては、リスナーを使ってビューとコントローラを結びつけるのがオーソドックスな方法としてあり、それにより、ビューとコントローラを分離することはできますが、面倒なのでビューにリスナーをimplementsすることが多いのではないかと思います。
WebアプリだとMVC model2 とかあったはずですが、そこではコントローラには非常に単純な責務しか与えないので、モデル側にいろいろな責務がくるのですが、その結果モデルが複雑な機能を持つようになります。しかし、モデルの永続化にあたってはRDBを使っていて、永続化は機械的にできるようにしつつ、複雑な機能を持たせたモデルというのを設計したり実装したりするのは、そこそこに面倒なので、困ったなー、ということになりがちです。
まぁ、でも、結局面倒なことを誰がするか、だけの問題なので、どんなパターンを持ってきても、そこが解決することはないのだろうと考えています。単純なパターンのものは、悩むようなことはなく、そのままたんたんと設計実装をすればいいだけなので、MVCを基本的に覚えておけば、なんとでもなるはずです。もちろん、応用もたくさん知ってた方がいいですがね。