Dapatkah seseorang tolong jelaskan kepada saya apa perbedaan antara pola metode templat dan pola strategi?
Sejauh yang saya tahu mereka 99% sama - satu-satunya perbedaan adalah bahwa pola metode template memiliki kelas abstrak sebagai kelas dasar sedangkan kelas strategi menggunakan antarmuka yang diimplementasikan oleh setiap kelas strategi konkret.
Namun, sejauh menyangkut klien mereka dikonsumsi dengan cara yang persis sama - apakah ini benar?
Jawaban:
Perbedaan utama antara keduanya adalah ketika algoritma konkret dipilih.
Dengan pola metode Templat ini terjadi pada waktu kompilasi dengan subklasifikasi templat. Setiap subclass menyediakan algoritma konkret yang berbeda dengan menerapkan metode abstrak template. Ketika klien memanggil metode antarmuka eksternal templat, templat memanggil metode abstraknya (antarmuka internal) sebagaimana diperlukan untuk mengaktifkan algoritme.
Sebaliknya, pola Strategi memungkinkan algoritma dipilih pada saat runtime oleh kontainmen . Algoritma konkret diimplementasikan oleh kelas atau fungsi terpisah yang diteruskan ke strategi sebagai parameter untuk konstruktornya atau metode penyetel. Algoritma mana yang dipilih untuk parameter ini dapat bervariasi secara dinamis berdasarkan status atau input program.
Singkatnya:
sumber
if (config.useAlgoA) impl = new AlgoA() else impl = new AlgoB()
) sehingga jawaban ini salah.new ConcreteAlgorithm1()
lawannew ConcreteAlgorithm2()
. Tentunya pilihan terjadi pada saat runtime (membuat pilihan algoritma pada waktu kompilasi akan berarti mengkodekannya). Perbedaan utama antara keduanya adalah bagaimana algoritma konkret diimplementasikan. Apakah ini diterapkan sebagai subkelas atau sebagai antarmuka terpisah? Yang pertama adalah Templat. Yang terakhir adalah Strategi. Perbedaannya dapat diringkas sebagai komposisi vs warisan, yang merupakan tema umum dari buku GoF.Pola templat digunakan ketika operasi tertentu memiliki beberapa perilaku invarian yang dapat didefinisikan dalam hal perilaku primitif yang berbeda-beda. Kelas abstrak mendefinisikan perilaku invarian (s), sedangkan kelas implementasi mendefinisikan metode dependen.
Dalam sebuah strategi, implementasi perilaku independen - setiap kelas implementasi mendefinisikan perilaku dan tidak ada kode yang dibagikan di antara mereka. Keduanya adalah pola perilaku dan, dengan demikian, dikonsumsi dengan cara yang sama oleh klien. Biasanya strategi memiliki satu metode publik -
execute()
metode tersebut, sedangkan templat dapat menentukan sekumpulan metode publik serta sekumpulan primitif pribadi pendukung yang harus diimplementasikan oleh subkelas.Kedua pola tersebut dapat dengan mudah digunakan bersama. Anda mungkin memiliki pola strategi di mana beberapa implementasi milik keluarga strategi diimplementasikan menggunakan pola templat.
sumber
Saya pikir Class-Diagram dari kedua pola menunjukkan perbedaan.
Strategi
Meringkas suatu algoritma di dalam kelas.
Tautan ke gambar
Metode Templat
Tunda langkah-langkah tepat suatu algoritma ke subkelas
Tautan ke Gambar
sumber
Anda mungkin bermaksud pola metode templat. Anda benar, mereka melayani kebutuhan yang sangat mirip. Saya akan mengatakan lebih baik menggunakan metode template dalam kasus ketika Anda memiliki algoritma "template" memiliki langkah-langkah yang ditentukan di mana subclass menimpa langkah-langkah ini untuk mengubah beberapa detail. Dalam hal strategi, Anda perlu membuat antarmuka, dan alih-alih pewarisan yang Anda gunakan delegasi. Saya akan mengatakan itu adalah pola yang sedikit lebih kuat dan mungkin lebih baik sesuai dengan prinsip inversi DIP - dependensi. Ini lebih kuat karena Anda dengan jelas mendefinisikan abstraksi strategi baru - cara melakukan sesuatu, yang tidak berlaku untuk metode templat. Jadi, jika abstraksi ini masuk akal - gunakanlah. Namun, menggunakan metode template dapat memberi Anda desain yang lebih sederhana dalam kasus-kasus sederhana, yang juga penting. Pertimbangkan kata-kata mana yang lebih cocok: apakah Anda memiliki algoritma templat? Atau hal utama di sini adalah Anda memiliki abstraksi strategi - cara baru dalam melakukan sesuatu
Contoh metode templat:
Di sini Anda mewarisi dari aplikasi dan mengganti apa yang sebenarnya akan dilakukan pada init, jalankan dan selesai.
Contoh strategi:
Di sini, saat menulis pembanding, Anda tidak mewarisi dari array. Array mendelegasikan algoritma perbandingan ke pembanding.
sumber
Kesamaan
Pola strategi dan metode Templat memiliki banyak kesamaan di antara mereka. Pola strategi dan metode Templat dapat digunakan untuk memenuhi Prinsip Terbuka-Tertutup dan membuat modul perangkat lunak mudah diperluas tanpa mengubah kode-kodenya. Kedua pola mewakili pemisahan fungsionalitas generik dari implementasi rinci fungsionalitas itu. Namun, mereka sedikit berbeda dalam hal granularitas yang mereka tawarkan.
Perbedaan
Berikut adalah beberapa perbedaan yang saya amati saat mempelajari dua pola ini:
Gambar diambil dari blog yang digigit .
sumber
Warisan versus agregasi (is-a versus has-a). Ada dua cara untuk mencapai tujuan yang sama.
Pertanyaan ini menunjukkan beberapa trade-off antara pilihan: Warisan vs Agregasi
sumber
Keduanya sangat mirip, dan keduanya dikonsumsi oleh kode klien dengan cara yang sama. Tidak seperti apa yang dikatakan oleh jawaban paling populer di atas, keduanya memungkinkan pemilihan algoritma saat run-time .
Perbedaan antara keduanya adalah bahwa sementara pola strategi memungkinkan implementasi yang berbeda untuk menggunakan cara yang sama sekali berbeda untuk mencapai hasil yang diinginkan, pola metode templat menentukan algoritma menyeluruh (metode "templat") yang digunakan untuk mencapai hasil - - satu-satunya pilihan yang tersisa untuk implementasi spesifik (sub-kelas) adalah rincian tertentu dari metode templat tersebut. Hal ini dilakukan dengan meminta metode templat melakukan panggilan ke satu atau lebih metode abstrak yang diganti (yaitu diimplementasikan) oleh sub-kelas, tidak seperti metode templat yang dengan sendirinya tidak abstrak dan tidak diganti oleh sub-kelas .
Kode klien melakukan panggilan ke metode templat menggunakan referensi / pointer dari tipe kelas abstrak yang menunjuk ke turunan dari salah satu sub kelas konkret yang dapat ditentukan pada saat run time seperti saat menggunakan Pola Strategi.
sumber
Metode Templat:
Struktur template_method :
Strategi:
Struktur strategi :
Lihatlah metode Templat dan artikel Strategi untuk pemahaman yang lebih baik.
Pos terkait:
Pola desain template di JDK, tidak dapat menemukan metode yang mendefinisikan serangkaian metode yang akan dieksekusi secara berurutan
Contoh Dunia Nyata dari Pola Strategi
sumber
Tidak, mereka tidak perlu dikonsumsi dengan cara yang sama. Pola "metode templat" adalah cara untuk menyediakan "panduan" bagi pelaksana di masa mendatang. Anda memberi tahu mereka, "Semua objek Orang harus memiliki Nomor Jaminan Sosial" (itu contoh sepele tetapi mendapat ide dengan benar).
Pola strategi memungkinkan beberapa implementasi yang mungkin untuk diaktifkan dan dikeluarkan. Ini tidak (biasanya) dilaksanakan melalui warisan, tetapi sebaliknya dengan membiarkan pemanggil lulus dalam implementasi yang diinginkan. Contoh mungkin memungkinkan ShippingCalculator untuk diberikan dengan salah satu dari beberapa cara berbeda menghitung pajak (implementasi NoSalesTax, dan implementasi PersentaseBasedSalesTax mungkin).
Jadi, kadang-kadang, klien benar-benar akan memberi tahu objek strategi yang digunakan. Seperti dalam
Tetapi klien tidak akan pernah melakukan itu untuk objek yang didasarkan pada Metode Templat. Bahkan, klien mungkin bahkan tidak tahu objek didasarkan pada Metode Templat. Metode-metode abstrak dalam pola Metode Templat bahkan mungkin dilindungi, dalam hal ini klien bahkan tidak akan tahu mereka ada.
sumber
Saya sarankan Anda untuk membaca artikel ini . Ini menjelaskan perbedaan pada contoh kasus nyata.
Kutipan dari artikel
sumber
Pola Templat mirip dengan pola Strategi. Kedua pola ini berbeda dalam ruang lingkup dan metodologi.
Strategi digunakan untuk memungkinkan penelepon memvariasikan seluruh algoritme, seperti cara menghitung berbagai jenis pajak, sedangkan Metode Templat digunakan untuk memvariasikan langkah-langkah dalam suatu algoritma. Karena itu, Strategi lebih berbutir kasar. Templat memungkinkan kontrol berbutir halus dalam urutan operasi, namun memungkinkan implementasi rincian ini bervariasi.
Perbedaan utama lainnya adalah bahwa Strategi menggunakan pendelegasian sementara Metode Templat menggunakan pewarisan. Dalam Strategi, algoritme didelegasikan ke kelas xxxStrategy lain yang akan dijadikan referensi oleh subjek, tetapi dengan Templat Anda mensubklasifikasikan basis dan mengganti metode untuk membuat perubahan.
dari http://cyruscrypt.blogspot.com/2005/07/template-vs-strategy-patterns.html
sumber
Dalam subclass pola strategi menjalankan pertunjukan dan mereka mengontrol algoritma. Di sini kode digandakan di seluruh subclass. Pengetahuan tentang algoritma dan cara mengimplementasikannya didistribusikan ke banyak kelas.
Dalam pola templat, kelas dasar memiliki algoritma. Ini memaksimalkan penggunaan kembali di antara subclass. Karena algoritma terletak di satu tempat, kelas dasar melindunginya.
sumber
sumber
Pola Templat:
Metode template adalah tentang membiarkan subclass mendefinisikan kembali langkah-langkah tertentu dari algoritma, tanpa mengubah struktur utama dan langkah-langkah algoritma, yang didefinisikan dalam kelas dasar. Pola templat biasanya menggunakan pewarisan, sehingga implementasi umum dari algoritma dapat disediakan di kelas dasar, yang dapat ditimpa oleh subkelas jika perlu.
Catatan dalam kode di atas, langkah-langkah algoritma go () akan selalu sama, tetapi subclass mungkin mendefinisikan resep berbeda untuk melakukan langkah tertentu.
Pola Strategi:
Pola strategi adalah tentang membiarkan klien memilih implementasi algoritma konkret saat runtime. Semua algoritma terisolasi dan independen, tetapi menerapkan antarmuka umum, dan tidak ada gagasan untuk menentukan langkah-langkah tertentu dalam algoritma.
Untuk kode sumber lengkap, lihat repositori github saya .
sumber
Strategi diekspos sebagai metode Antarmuka dan templat sebagai Kelas Abstrak. Ini biasanya banyak digunakan dalam kerangka kerja. misalnya kelas MessageSource Spring framework adalah antarmuka strategi untuk menyelesaikan pesan. Klien menggunakan implementasi (strategi) tertentu dari antarmuka ini.
Dan implementasi abstrak dari interface yang sama AbstractMessageSource, yang memiliki implementasi umum dari penyelesaian pesan dan memperlihatkan metode abstrak resolCode () sehingga sub-kelas dapat mengimplementasikannya dengan cara mereka. AbstractMessageSource adalah contoh metode templat.
http://docs.spring.io/spring/docs/4.1.7.RELEASE/javadoc-api/org/springframework/context/support/AbstractMessageSource.html
sumber
Dalam metode templat pola desain ini, satu atau beberapa langkah algoritma dapat ditimpa oleh subkelas untuk memungkinkan perilaku yang berbeda sambil memastikan bahwa algoritma menyeluruh masih diikuti (Wiki).
Metode pola nama Templat berarti apa itu. Katakanlah kita memiliki metode CalculateSomething () dan kami ingin membuat templat metode ini. Metode ini akan dinyatakan dalam kelas dasar sebagai metode non virtual. Katakanlah metodenya terlihat seperti ini.
} Implementasi metode Step1 dan Step2 dapat diberikan oleh kelas turunan.
Dalam Pola Strategi tidak ada implementasi yang disediakan oleh basis (Ini adalah alasan mengapa basis benar-benar sebuah antarmuka dalam diagram kelas)
Contoh klasiknya adalah sortir. Berdasarkan jumlah objek yang perlu disortir, kelas algoritma yang sesuai (gabungan, gelembung, dll.) Dibuat dan seluruh algoritma dienkapsulasi di setiap kelas.
Sekarang bisakah kita menerapkan pengurutan sebagai metode templat? Tentu saja Anda bisa, tetapi Anda tidak akan menemukan banyak kesamaan untuk disarikan dan ditempatkan dalam implementasi basis. Jadi itu mengalahkan tujuan pola metode templat.
sumber