Dalam pengalaman saya, dalam program desktop tradisional mvc gui, controller akhirnya terperangkap dalam tampilan. Sebagian besar orang tidak meluangkan waktu untuk mempertimbangkan kelas pengontrol.
Pola Desain di Smalltalk MVC
Triad Model / View / Controller (MVC) kelas [KP88] digunakan untuk membangun antarmuka pengguna di Smalltalk-80. Melihat pola desain di dalam MVC akan membantu Anda melihat apa yang kami maksud dengan istilah "pola."
MVC terdiri dari tiga jenis objek. Model adalah objek aplikasi, tampilan adalah presentasi layarnya, dan Pengontrol menentukan cara antarmuka pengguna bereaksi terhadap input pengguna. Sebelum MVC, desain antarmuka pengguna cenderung menyatukan objek-objek ini. MVC memisahkan mereka untuk meningkatkan fleksibilitas dan penggunaan kembali.
MVC memisahkan pandangan dan model dengan membuat protokol berlangganan / memberitahukan di antara mereka. Pandangan harus memastikan bahwa penampilannya mencerminkan keadaan model. Setiap kali data model berubah, model memberitahukan tampilan yang bergantung padanya. Sebagai tanggapan, setiap tampilan mendapat kesempatan untuk memperbarui sendiri. Pendekatan ini memungkinkan Anda melampirkan banyak tampilan ke model untuk memberikan presentasi yang berbeda. Anda juga dapat membuat tampilan baru untuk model tanpa menulis ulang.
Diagram berikut menunjukkan model dan tiga tampilan. (Kami telah meninggalkan pengontrol untuk kesederhanaan.) Model ini berisi beberapa nilai data, dan pandangan yang mendefinisikan spreadsheet, histogram, dan diagram lingkaran menampilkan data ini dengan berbagai cara. Model berkomunikasi dengan pandangannya ketika nilainya berubah, dan pandangan berkomunikasi dengan model untuk mengakses nilai-nilai ini.
Diambil pada nilai nominal, contoh ini mencerminkan desain yang memisahkan pandangan dari model. Tetapi desain ini berlaku untuk masalah yang lebih umum: memisahkan objek sehingga perubahan ke satu dapat mempengaruhi sejumlah orang lain tanpa memerlukan objek yang diubah untuk mengetahui detail yang lain. Desain yang lebih umum ini dijelaskan oleh pola desain Pengamat (halaman 293).
Fitur lain dari MVC adalah bahwa pandangan dapat disarangkan. Misalnya, panel kontrol tombol dapat diimplementasikan sebagai tampilan kompleks yang berisi tampilan tombol bersarang. Antarmuka pengguna untuk pemeriksa objek dapat terdiri dari tampilan bersarang yang dapat digunakan kembali dalam debugger. MVC mendukung tampilan bersarang dengan kelas CompositeView, subkelas View. Objek CompositeView bertindak seperti objek Lihat; tampilan komposit dapat digunakan di mana pun tampilan dapat digunakan, tetapi juga berisi dan mengelola tampilan bersarang.
Sekali lagi, kita dapat menganggap ini sebagai desain yang memungkinkan kita memperlakukan tampilan komposit seperti halnya kita memperlakukan salah satu komponennya. Tetapi desain ini berlaku untuk masalah yang lebih umum, yang terjadi kapan pun kita ingin mengelompokkan objek dan memperlakukan grup seperti objek individual. Desain yang lebih umum ini dijelaskan oleh pola desain Composite (163). Ini memungkinkan Anda membuat hierarki kelas di mana beberapa subclass mendefinisikan objek primitif (misalnya, Tombol) dan kelas lainnya mendefinisikan objek komposit (CompositeView) yang merakit primitif menjadi objek yang lebih kompleks.
MVC juga memungkinkan Anda mengubah cara tampilan merespons input pengguna tanpa mengubah presentasi visualnya. Anda mungkin ingin mengubah cara merespons keyboard, misalnya, atau menggunakan menu pop-up sebagai ganti kunci perintah. MVC merangkum mekanisme respons dalam objek Controller. Ada hirarki kelas pengontrol, sehingga mudah untuk membuat pengontrol baru sebagai variasi dari yang sudah ada.
Pandangan menggunakan turunan dari subkelas Pengendali untuk menerapkan strategi respons tertentu; untuk menerapkan strategi yang berbeda, cukup ganti instance dengan jenis pengontrol yang berbeda. Bahkan mungkin untuk mengubah pengontrol tampilan pada saat run-time untuk membiarkan tampilan mengubah cara responsnya terhadap input pengguna. Misalnya, tampilan dapat dinonaktifkan sehingga tidak menerima input hanya dengan memberinya pengontrol yang mengabaikan peristiwa input.
Hubungan View-Controller adalah contoh pola desain Strategi (315). Strategi adalah objek yang mewakili algoritma. Ini berguna ketika Anda ingin mengganti algoritma baik secara statis maupun dinamis, ketika Anda memiliki banyak varian algoritma, atau ketika algoritma memiliki struktur data yang kompleks yang ingin Anda enkapsulasi.
MVC menggunakan pola desain lain, seperti Metode Pabrik (107) untuk menentukan kelas pengontrol default untuk tampilan dan Penghias (175) untuk menambahkan gulir ke tampilan. Tetapi hubungan utama dalam MVC diberikan oleh Observer, Composite, dan pola desain Strategi.