Apa perbedaan antara pola desain Strategi dan pola desain Negara? Saya telah melalui beberapa artikel di web tetapi tidak dapat melihat perbedaannya dengan jelas.
Adakah yang bisa menjelaskan perbedaan istilah orang awam?
design-patterns
strategy-pattern
state-pattern
Chin Tser
sumber
sumber
Jawaban:
Sejujurnya, kedua pola ini sangat mirip dalam praktiknya, dan perbedaan yang menentukan di antara keduanya cenderung bervariasi tergantung pada siapa yang Anda tanya. Beberapa pilihan populer adalah:
Implementasi "klasik" akan cocok dengan Negara atau Strategi untuk setiap item dalam daftar, tetapi Anda menjalankan lintas hibrida yang memiliki campuran keduanya. Apakah yang satu itu lebih State-y atau Strategy-y pada akhirnya adalah pertanyaan subyektif.
sumber
getStatus()
metode yang akan mengembalikan status berbeda berdasarkan keadaan objek, tetapi pemanggil metode tidak harus dikodekan secara berbeda untuk memperhitungkan setiap keadaan potensial.sumber
Perbedaannya terletak pada mereka memecahkan masalah yang berbeda:
Namun, konstruksi untuk mencapai tujuan yang berbeda ini sangat mirip; kedua pola adalah contoh komposisi dengan delegasi.
Beberapa pengamatan tentang kelebihan mereka:
Dengan menggunakan pola Negara, kelas holding-state (konteks) dibebaskan dari pengetahuan tentang apa negara atau jenis itu dan apa negara atau jenis yang tersedia. Ini berarti bahwa kelas mematuhi prinsip desain terbuka-terbuka (OCP): kelas ditutup untuk perubahan dalam status / tipe apa yang ada, tetapi status / tipe tersebut terbuka untuk ekstensi.
Dengan menggunakan pola Strategi kelas yang menggunakan algoritma (konteks) dibebaskan dari pengetahuan tentang bagaimana melakukan tugas tertentu (- "algoritma"). Kasus ini juga menciptakan kepatuhan terhadap OCP; kelas ditutup untuk perubahan tentang cara melakukan tugas ini, tetapi desainnya sangat terbuka untuk penambahan algoritma lain untuk menyelesaikan tugas ini.
Ini kemungkinan juga meningkatkan kepatuhan kelas konteks terhadap prinsip tanggung jawab tunggal (SRP). Lebih lanjut, algoritma menjadi mudah tersedia untuk digunakan kembali oleh kelas lain.
sumber
Pola desain sebenarnya bukan konsep "awam", tetapi saya akan mencoba membuatnya sejelas mungkin. Pola desain apa pun dapat dipertimbangkan dalam tiga dimensi:
Mari kita bandingkan Negara dan Strategi.
Masalah polanya terpecahkan
Status digunakan dalam satu dari dua kasus [buku GoF hal. 306] :
Jika Anda ingin memastikan bahwa Anda memang memiliki masalah yang dipecahkan pola Negara, Anda harus dapat memodelkan keadaan objek menggunakan mesin keadaan terbatas . Anda dapat menemukan contoh terapan di sini .
Setiap transisi negara adalah metode di antarmuka Negara. Ini menyiratkan bahwa untuk suatu desain, Anda harus cukup yakin tentang transisi keadaan sebelum Anda menerapkan pola ini. Jika tidak, jika Anda menambah atau menghapus transisi, itu akan memerlukan perubahan antarmuka dan semua kelas yang mengimplementasikannya.
Saya pribadi belum menemukan pola ini yang bermanfaat. Anda selalu dapat menerapkan mesin negara hingga menggunakan tabel pencarian (ini bukan cara OO, tetapi bekerja cukup baik).
Strategi digunakan untuk [buku GoF hal. 316] :
Kasus terakhir dari mana menerapkan Strategi terkait dengan refactoring yang dikenal sebagai Ganti kondisional dengan polimorfisme .
Ringkasan: Negara dan Strategi memecahkan masalah yang sangat berbeda. Jika masalah Anda tidak dapat dimodelkan dengan mesin status terbatas, maka kemungkinan pola State tidak sesuai. Jika masalah Anda bukan tentang merangkum varian dari algoritma yang kompleks, maka Strategi tidak berlaku.
Struktur pola yang statis
Negara memiliki struktur kelas UML berikut:
Strategi memiliki struktur kelas UML berikut:
Ringkasan: dalam hal struktur statis, kedua pola ini sebagian besar identik. Bahkan, alat pendeteksi pola seperti ini menganggap bahwa " struktur pola [...] identik, melarang pembedaannya dengan proses otomatis (misalnya, tanpa merujuk pada informasi konseptual). "
Akan ada perbedaan besar, jika ConcreteStates memutuskan sendiri transisi status (lihat asosiasi " mungkin menentukan " pada diagram di atas). Ini menghasilkan sambungan antara kondisi konkret. Sebagai contoh (lihat bagian berikutnya), negara A menentukan transisi ke negara B. Jika kelas konteks memutuskan transisi ke keadaan konkret berikutnya, dependensi ini hilang.
Dinamika pola
Seperti yang disebutkan di bagian Masalah di atas, Negara menyiratkan bahwa perilaku berubah pada saat run-time tergantung pada beberapa keadaan objek. Oleh karena itu, gagasan transisi negara berlaku, seperti yang dibahas dengan hubungan mesin negara terbatas . [GoF] menyebutkan bahwa transisi dapat didefinisikan dalam subkelas ConcreteState, atau di lokasi terpusat (seperti lokasi berbasis tabel).
Mari kita asumsikan mesin negara terbatas sederhana:
Dengan asumsi subclass menentukan transisi keadaan (dengan mengembalikan objek keadaan berikutnya), dinamika terlihat seperti ini:
Untuk menunjukkan dinamika Strategi , ada baiknya meminjam contoh nyata .
Ringkasan : Setiap pola menggunakan panggilan polimorfik untuk melakukan sesuatu tergantung pada konteksnya. Dalam pola Negara, panggilan polimorfik (transisi) sering menyebabkan perubahan di negara berikutnya . Dalam pola Strategi, panggilan polimorfik biasanya tidak mengubah konteks (misalnya, membayar dengan kartu kredit sekali tidak berarti Anda akan membayar melalui PayPal di waktu berikutnya). Sekali lagi, dinamika pola negara ditentukan oleh mesin negara fininte yang sesuai , yang (bagi saya) sangat penting untuk memperbaiki penerapan pola ini.
sumber
Pola Strategi melibatkan memindahkan implementasi algoritma dari kelas hosting dan meletakkannya di kelas yang terpisah. Ini berarti bahwa kelas host tidak perlu menyediakan implementasi dari setiap algoritma itu sendiri, yang cenderung mengarah pada kode yang tidak bersih.
Algoritma pengurutan biasanya digunakan sebagai contoh karena mereka semua melakukan hal yang sama (sort). Jika setiap algoritma pengurutan yang berbeda dimasukkan ke dalam kelasnya sendiri, maka klien dapat dengan mudah memilih algoritma mana yang akan digunakan dan polanya menyediakan cara mudah untuk mengaksesnya.
Pola Negara melibatkan mengubah perilaku suatu objek ketika keadaan objek berubah. Ini berarti bahwa kelas host tidak menyediakan implementasi perilaku untuk semua keadaan berbeda yang bisa terjadi. Kelas host biasanya merangkum kelas yang menyediakan fungsionalitas yang diperlukan dalam keadaan tertentu, dan beralih ke kelas yang berbeda. ketika negara berubah.
sumber
Pertimbangkan sistem IVR (Respon Suara Interaktif) yang menangani panggilan pelanggan. Anda mungkin ingin memprogramnya untuk menangani pelanggan di:
Untuk menangani situasi ini, Anda dapat menggunakan Pola Negara .
Proses menghubungkan pelanggan ke eksekutif dukungan itu sendiri dapat diimplementasikan menggunakan Pola Strategi di mana eksekutif dipilih berdasarkan salah satu dari:
Pola strategi memutuskan ' bagaimana ' untuk melakukan beberapa tindakan dan pola negara memutuskan ' kapan ' untuk melakukan itu.
sumber
Strategi mewakili objek yang "melakukan" sesuatu, dengan hasil awal dan akhir yang sama, tetapi secara internal menggunakan metodologi yang berbeda. Dalam arti mereka analog dengan mewakili implementasi kata kerja. Pola State OTOH menggunakan objek yang "adalah" sesuatu - keadaan operasi. Meskipun mereka dapat mewakili operasi pada data itu juga, mereka lebih analog dengan representasi kata benda daripada kata kerja, dan dirancang untuk mesin negara.
sumber
Strategi: strategi diperbaiki dan biasanya terdiri dari beberapa langkah. (Penyortiran hanya merupakan satu langkah dan karenanya merupakan contoh yang sangat buruk karena terlalu primitif untuk memahami tujuan dari pola ini). Rutin "utama" Anda dalam strategi ini memanggil beberapa metode abstrak. Misal "Enter Room Strategy", "main-method" adalah goThroughDoor (), yang terlihat seperti: approachDoor (), if (terkunci ()) openLock (); openDoor (); enterRoom (); belok(); tutup pintu(); if (wasLocked ()) lockDoor ();
Sekarang subkelas dari "algoritma" umum ini untuk berpindah dari satu ruangan ke ruangan lain melalui pintu yang mungkin terkunci dapat menerapkan langkah-langkah algoritma.
Dengan kata lain, subklasifikasi strategi tidak mengubah algoritma dasar, hanya langkah-langkah individual.
BAHWA DI ATAS adalah Pola Metode Pola. Sekarang masukkan langkah-langkah yang dimiliki bersama (membuka / mengunci dan membuka / menutup) ke objek implementasinya sendiri dan mendelegasikannya kepada mereka. Misalnya kunci dengan kunci dan kunci dengan kartu kode adalah dua jenis kunci. Delegasikan dari strategi ke objek "Langkah". Sekarang Anda memiliki pola Strategi.
Pola Negara adalah sesuatu yang sangat berbeda.
Anda memiliki objek pembungkus dan objek terbungkus. Yang dibungkus adalah "negara". Objek keadaan hanya diakses melalui pembungkusnya. Sekarang Anda dapat mengubah objek yang dibungkus kapan saja, sehingga pembungkusnya tampaknya mengubah statusnya, atau bahkan "kelas" atau jenisnya.
Misalnya Anda memiliki layanan log on. Ia menerima nama pengguna dan kata sandi. Hanya memiliki satu metode: logon (String userName, String passwdHash). Alih-alih memutuskan sendiri apakah log masuk diterima atau tidak, ia mendelegasikan keputusan ke objek negara. Objek keadaan itu biasanya hanya memeriksa apakah kombinasi pengguna / pass valid dan melakukan log on. Tetapi sekarang Anda dapat menukar "Pemeriksa" dengan yang hanya memungkinkan pengguna yang dilindungi hak akses masuk (selama mis. Waktu pemeliharaan) atau dengan yang tidak mengizinkan siapa pun masuk. Itu berarti "pemeriksa" menyatakan "status masuk log" dari sistem.
Perbedaan yang paling penting adalah: ketika Anda memilih strategi, Anda tetap menggunakannya sampai selesai. Itu berarti Anda menyebutnya "metode utama" dan selama itu berjalan Anda tidak pernah mengubah strategi. OTOH dalam situasi pola keadaan selama runtime sistem Anda, Anda mengubah keadaan secara sewenang-wenang sesuai keinginan Anda.
sumber
Pola strategi digunakan ketika Anda memiliki beberapa algoritma untuk tugas tertentu dan klien memutuskan implementasi aktual untuk digunakan saat runtime.
Diagram UML dari artikel pola Strategi wiki :
Fitur utama:
Lihat posting ini untuk info lebih lanjut & contoh dunia nyata:
Contoh Dunia Nyata dari Pola Strategi
Negara pola memungkinkan sebuah objek untuk mengubah perilakunya ketika perubahan internal negara
Diagram UML dari artikel pola wiki State:
Jika kita harus mengubah perilaku objek berdasarkan statusnya, kita dapat memiliki variabel status di objek dan menggunakan blok kondisi if-else untuk melakukan tindakan berbeda berdasarkan kondisi. Pola negara digunakan untuk menyediakan cara yang sistematis dan kehilangan-digabungkan untuk mencapai ini melalui implementasi Konteks dan Negara .
Lihat artikel journaldev ini untuk lebih jelasnya.
Perbedaan utama dari pembuatan sumber dan artikel jurnal :
sumber
Dalam bahasa awam,
dalam pola Strategi, tidak ada negara atau semuanya memiliki keadaan yang sama. Semua orang memiliki cara yang berbeda dalam melakukan tugas, seperti dokter yang berbeda mengobati penyakit yang sama dari pasien yang sama dengan keadaan yang sama dengan cara yang berbeda.
Dalam Pola keadaan, secara subyektif ada keadaan, seperti keadaan pasien saat ini (katakan suhu tinggi atau suhu rendah), berdasarkan pada tindakan selanjutnya (resep obat) yang akan diputuskan. Dan satu keadaan dapat menyebabkan keadaan lain, sehingga ada keadaan untuk menyatakan ketergantungan (komposisi secara teknis).
Jika kita secara teknis mencoba memahaminya, berdasarkan perbandingan kode keduanya, kita mungkin kehilangan subjektivitas situasi, karena keduanya terlihat sangat mirip.
sumber
Kedua pola mendelegasikan ke kelas dasar yang memiliki beberapa turunan, tetapi hanya dalam pola Negara bahwa kelas-kelas turunan ini menyimpan referensi kembali ke kelas konteks.
Cara lain untuk melihatnya adalah bahwa pola Strategi adalah versi yang lebih sederhana dari pola Negara; sub-pola, jika Anda suka. Ini benar-benar tergantung apakah Anda ingin negara yang diturunkan menyimpan referensi kembali ke konteks atau tidak (yaitu: apakah Anda ingin mereka memanggil metode pada konteks).
Untuk info lebih lanjut: Robert C Martin (& Micah Martin) menjawab ini dalam buku mereka, "Prinsip Agile, Pola dan Praktek di C #". ( http://www.amazon.com/Agile-Principles-Patterns-Practices-C/dp/0131857258 )
sumber
Ini adalah pertanyaan yang cukup lama, tapi tetap saja, saya juga mencari jawaban yang sama dan inilah yang saya temukan.
Untuk pola Keadaan mari kita perhatikan contoh tombol Putar Pemain Medial. Ketika kami memainkannya, ia mulai bermain dan membuat konteksnya sadar bahwa itu sedang diputar. Setiap kali klien ingin melakukan operasi permainan, ia memeriksa kondisi pemain saat ini. Sekarang klien tahu keadaan objek diputar melalui objek konteks sehingga ia memanggil metode tindakan objek keadaan jeda. Bagian klien menyadari keadaan dan pada keadaan apa yang perlu dilakukan tindakan dapat diotomatisasi.
https://www.youtube.com/watch?v=e45RMc76884 https://www.tutorialspoint.com/design_pattern/state_pattern.htm
Dalam kasus pola Strategi, pengaturan diagram kelas sama dengan pola keadaan. Klien datang ke pengaturan ini untuk melakukan beberapa operasi. Itu bukan keadaan yang berbeda ada algoritma yang berbeda katakan misalnya analisis yang berbeda yang perlu dilakukan pada pola. Di sini klien memberi tahu konteks apa yang ingin dilakukan algoritma itu (algoritme kustom yang ditentukan bisnis) lalu melakukan itu.
https://www.tutorialspoint.com/design_pattern/strategy_pattern.htm
Keduanya menerapkan prinsip buka tutup sehingga pengembang memiliki kemampuan untuk menambahkan status baru ke pola keadaan dan algoritma baru.
Tetapi perbedaannya adalah apa yang mereka gunakan yaitu pola keadaan yang digunakan untuk mengeksekusi logika yang berbeda berdasarkan keadaan objek. Dan dalam kasus strategi logika berbeda.
sumber
Negara datang dengan sedikit dependensi dalam kelas yang diturunkan negara: seperti satu negara tahu tentang negara lain yang datang setelah itu. Misalnya, Musim Panas datang setelah musim dingin untuk setiap negara musim, atau negara Pengiriman setelah negara Deposit untuk berbelanja.
Di sisi lain, Strategi tidak memiliki dependensi seperti ini. Di sini, segala jenis negara dapat diinisialisasi berdasarkan jenis program / produk.
sumber
Perbedaannya dibahas dalam http://c2.com/cgi/wiki?StrategyPattern . Saya telah menggunakan pola Strategi untuk memungkinkan algoritma yang berbeda dipilih dalam kerangka kerja keseluruhan untuk menganalisis data. Melalui itu Anda dapat menambahkan algoritma tanpa harus mengubah kerangka kerja keseluruhan dan logikanya.
Contoh khas adalah bahwa Anda memiliki kerangka kerja untuk mengoptimalkan fungsi. Kerangka kerja mengatur data dan parameter. Pola strategi memungkinkan Anda untuk memilih algoritma seperti sttepest descents, conjugate gradients, BFGS, dll. Tanpa mengubah kerangka kerja.
sumber
Baik Strategi dan pola Negara memiliki struktur yang sama. Jika Anda melihat diagram kelas UML untuk kedua pola mereka terlihat sama persis, tetapi tujuannya sama sekali berbeda. Pola desain keadaan digunakan untuk mendefinisikan dan mengelola keadaan suatu objek, sedangkan pola Strategi digunakan untuk mendefinisikan satu set algoritma yang dapat dipertukarkan dan memungkinkan klien untuk memilih salah satunya. Jadi pola Strategi adalah pola yang didorong oleh klien, sementara Obyek dapat mengatur keadaan di sana itu sendiri.
sumber
Singkatnya, dengan pola strategi kita dapat mengatur beberapa perilaku dengan cepat, dengan pola keadaan, kita dapat yakin, bahwa suatu objek akan mengubah perilakunya secara internal dengan perubahan statusnya.
sumber
Ketika Anda memiliki proyek yang dapat dibagi menjadi 2 tugas:
tugas 1: Anda dapat menggunakan salah satu dari dua algoritma berbeda untuk menyelesaikan: alg1, alg2
tugas 2: Anda dapat menggunakan salah satu dari tiga algoritma berbeda untuk menyelesaikan: alg3, alg4, alg5
alg1 dan alg2 dapat dipertukarkan; alg3, alg4 dan alg5 dapat dipertukarkan.
Memilih algoritma yang akan dilakukan dalam tugas 1 dan tugas 2 tergantung pada status:
negara 1: Anda perlu alg1 di tugas 1 dan alg3 di tugas 2
status 2: Anda membutuhkan alg2 di tugas 1 dan alg5 di tugas 2
Konteks Anda dapat mengubah objek negara dari status 1 ke status 2. Kemudian tugas Anda akan diselesaikan dengan alg2 dan alg5, bukan alg1 dan alg3.
Anda dapat menambahkan lebih banyak algoritma yang dapat dipertukarkan untuk tugas 1 atau tugas 2. Ini adalah pola strategi.
Anda dapat memiliki lebih banyak status dengan kombinasi algoritma yang berbeda dalam tugas 1 dan tugas 2. Pola status memungkinkan Anda untuk beralih dari satu kondisi ke kondisi lain dan melakukan kombinasi algoritma yang berbeda.
sumber
'Strategi' hanyalah sebuah algoritma yang dapat Anda ubah dalam keadaan yang berbeda sesuai kebutuhan, dan ia memproses sesuatu untuk Anda. Ex. Anda dapat memilih cara memampatkan file. zip atau rar ... dalam suatu metode.
Tapi 'Status' BISA mengubah semua perilaku objek Anda, ketika itu berubah, Bahkan itu dapat mengubah bidang lain ... itu sebabnya ia memiliki referensi ke pemiliknya. Anda harus memperhatikan bahwa mengubah bidang objek dapat mengubah perilaku objek sama sekali. Ex. ketika Anda mengubah State0 ke State1 di obj, Anda mengubah bilangan bulat menjadi 10. .. jadi ketika kami memanggil obj.f0 () yang melakukan beberapa perhitungan dan menggunakan bilangan bulat itu, itu mempengaruhi hasilnya.
sumber