Definisi: Tentukan satu set algoritma, merangkum setiap algoritma, dan membuatnya dipertukarkan.
Jenis: Pola perilaku
Diagram kelas:
Pola kebijakan adalah enkapsulasi algoritma, merangkum serangkaian algoritma ke dalam kelas yang sesuai, dan kelas -kelas ini menerapkan antarmuka yang sama dan dapat digantikan satu sama lain. Dalam mode kelas perilaku yang disebutkan di atas, ada pola yang juga berfokus pada enkapsulasi algoritma - mode metode templat. Dibandingkan dengan diagram kelas, Anda dapat melihat bahwa perbedaan antara mode kebijakan dan mode metode template hanya bahwa ada konteks kelas enkapsulasi terpisah. Perbedaan antara itu dan mode metode templat adalah: dalam mode metode templat, badan utama algoritma panggilan ada di kelas induk abstrak, sedangkan dalam mode strategi, badan utama algoritma panggilan dienkapsulasi ke dalam konteks kelas enkapsulasi. Strategi strategi abstrak pada umumnya merupakan antarmuka, tujuannya hanya untuk menentukan spesifikasi, dan umumnya tidak mengandung logika. Bahkan, ini hanyalah implementasi umum. Dalam pemrograman aktual, karena pasti ada beberapa logika yang sama antara setiap kelas implementasi strategi spesifik, untuk menghindari kode duplikat, kami sering menggunakan kelas abstrak untuk memainkan peran strategi dan merangkum kode publik. Oleh karena itu, dalam banyak skenario aplikasi, bayangan pola metode template umumnya terlihat dalam mode strategi.
Struktur pola kebijakan
Kelas Enkapsulasi: Juga dikenal sebagai konteks, enkapsulasi kebijakan sekunder adalah untuk menghindari panggilan langsung ke kebijakan dengan modul tingkat tinggi.
Strategi Abstrak: Biasanya antarmuka. Ketika ada logika duplikat di setiap kelas implementasi, kelas abstrak digunakan untuk merangkum bagian kode umum ini. Pada saat ini, pola kebijakan lebih mirip dengan pola metode templat.
Strategi spesifik: Peran strategi spesifik biasanya dilakukan oleh serangkaian kelas yang dikemas dengan algoritma, dan kelas -kelas ini dapat diganti secara bebas sesuai kebutuhan.
Contoh skenario aplikasi:
Liu Bei akan menikah dengan istrinya di Jiangdong. Sebelum pergi, Zhuge Liang memberi Zhao Yun (pria terbaik) tiga trik, mengatakan bahwa itu akan menyelesaikan masalah sulit dengan membongkar itu sesuai dengan rahasia surga. Hei, katakanlah, itu benar -benar memecahkan masalah besar. Pada akhirnya, Zhou Yu menemani istrinya dan kemudian mematahkan pasukannya. Pertama -tama mari kita lihat seperti apa adegan ini.
Mari kita bicara tentang elemen -elemen dalam adegan ini: tiga trik pintar, satu trik pintar, dan satu trik pintar. Trik pintar diberikan oleh Brother Liang. Trik pintar umumnya dikenal sebagai trik pintar. Kemudian Zhao Yun adalah seorang pekerja yang mengeluarkan trik pintar, menjalankannya, dan kemudian menang. Bagaimana cara mengekspresikan ini menggunakan program java?
Mari kita lihat gambarnya dulu?
Tiga trik adalah jenis hal yang sama, jadi mari kita tulis antarmuka:
paket com.yangganganfu.strategy; /**** @author [email protected]: afu* Pertama -tama mendefinisikan antarmuka strategi, yang merupakan antarmuka dari tiga trik yang diberikan Zhuge Liang kepada Zhao Yun. */Antarmuka Publik IStrategy {// Setiap trik adalah algoritma yang dapat dieksekusi. public void operate (); }
Kemudian tulis tiga kelas implementasi, ada tiga trik pintar:
Rencana Clever: Kedatangan Pertama di Wu:
paket com.yangganganfu.strategy; /**** @author [email protected]: A Fu* Mintalah Tn. Qiao untuk membantu, sehingga Sun Quan tidak dapat membunuh Liu Bei. */ Kelas Publik Backdoor mengimplementasikan istrategy {@Override public void operate () {System.out.println ("Mencari bantuan Qiao Guo lama, biarkan Wu Guotai memberi tekanan pada Sun Quan sehingga Sun Quan tidak dapat membunuh Liu Bei ..."); }}
Trik kedua: Tolong beri Wu Guotai lampu hijau dan lepaskan:
paket com.yangganganfu.strategy; /**** @author [email protected]: a fu* Tolong beri Wu Guotai lampu hijau. */ kelas publik Givengreenlight mengimplementasikan istrategy {@Override public void operate () {System.out.println ("Tolong beri Wu Guotai lampu hijau, lepaskan!"); }}
Keterampilan 3: Mrs. Sun memotong bagian belakang dan menghalangi pengejar:
paket com.yangganganfu.strategy; /**** @author [email protected]: afu* Mrs. Sun memotong bagian belakang dan memblokir pengejar. */ Public Class Blackenemy mengimplementasikan istrategy {@Override public void operate () {System.out.println ("Mrs. Sun memotong bagian belakang, menghalangi pengejar ..."); }}
Oke, semuanya, ada tiga trik, jadi ada tempat untuk memasukkannya ke dalam tip:
paket com.yangganganfu.strategy; / ** * * @author [email protected]: afu * */ Konteks kelas publik {Private Istrategy Strategy; // konstruktor, trik mana yang ingin Anda gunakan konteks publik (strategi istrategy) {this.strategy = strategi; } public void operate () {this.strategy.operate (); }}
Kemudian Zhao Yun membawa tiga tips dengan keberanian besar, menarik lelaki tua Liu Bei, yang sudah memasuki barisan orang tua dan ingin menikahi seorang gadis yang tidak bersalah, pergi untuk menikah dengan istrinya. Hai, apalagi, tiga trik Brother Liang sangat bagus. Lihat:
paket com.yangganganfu.strategy; Kelas Publik Zhaoyun { /*** Zhao Yun muncul. Menurut penjelasan Zhuge Liang kepadanya, ia membongkar trik pada gilirannya*/ public static void main (string [] args) {konteks konteks; // Ketika saya pertama kali tiba di Wu, saya membongkar sistem pertama.out.println ("-----------------------------------------"); konteks = konteks baru (backdoor baru ()); Context.Operate (); // Jalankan System.out.println ("/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N"); // Ketika Liu Bei senang tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau Tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau tidak mau membongkar sistem tip ketiga. konteks = konteks baru (new blackenemy ()); context.operate (); // Bongkar dan jalankan System.out.println("/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n /n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n /n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n /n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n
Keuntungan dan Kerugian Mode Kebijakan Keuntungan utama dari mode kebijakan adalah:
Kelas kebijakan dapat dialihkan secara bebas, dan karena kelas kebijakan menerapkan abstraksi yang sama, mereka dapat dialihkan secara bebas.
Mudah diperluas, menambahkan kebijakan baru sangat mudah untuk model kebijakan, dan pada dasarnya dapat diperluas tanpa mengubah kode asli.
Hindari menggunakan beberapa kondisi. Jika Anda tidak menggunakan mode kebijakan, untuk semua algoritma, pernyataan bersyarat harus digunakan untuk terhubung, dan algoritma yang akan digunakan melalui penilaian bersyarat. Dalam artikel sebelumnya, kami menyebutkan bahwa menggunakan beberapa penilaian bersyarat sangat sulit untuk dipertahankan.
Ada dua kelemahan utama dari model strategi:
Mempertahankan berbagai kelas kebijakan akan membawa overhead tambahan untuk pengembangan. Anda mungkin memiliki pengalaman dalam hal ini: secara umum, jumlah kelas kebijakan melebihi 5, yang lebih merepotkan.
Semua kelas kebijakan harus diekspos ke klien (penelepon) karena tergantung pada klien untuk digunakan, sehingga klien harus tahu kebijakan apa yang ada dan memahami perbedaan antara berbagai kebijakan, jika tidak konsekuensinya serius. Misalnya, ada model strategi untuk menyortir algoritma yang menyediakan tiga algoritma: penyortiran cepat, penyortiran gelembung, dan pilih penyortiran. Sebelum klien menggunakan algoritma ini, haruskah mereka memahami penerapan ketiga algoritma ini? Misalnya, klien perlu menggunakan wadah, yang diimplementasikan oleh daftar dan array tertaut. Apakah klien juga perlu memahami perbedaan antara daftar dan array yang ditautkan? Dalam hal ini, itu bertentangan dengan hukum Dimitian.
Skenario yang berlaku
Saat melakukan desain yang berorientasi objek, Anda harus sangat akrab dengan pola kebijakan, karena pada dasarnya adalah warisan dan polimorfisme dalam berorientasi objek. Setelah membaca kode umum dari pola kebijakan, saya pikir bahkan jika saya belum pernah mendengar pola kebijakan sebelumnya, saya harus menggunakannya selama proses pengembangan, bukan? Setidaknya dalam dua situasi berikut, Anda dapat mempertimbangkan menggunakan model strategi.
Logika utama dari beberapa kelas adalah sama, dan hanya ada sedikit perbedaan dalam algoritma dan perilaku logika parsial.
Ada beberapa perilaku serupa, atau algoritma, dan klien perlu secara dinamis memutuskan mana yang akan digunakan, sehingga Anda dapat menggunakan pola kebijakan untuk merangkum algoritma ini untuk dihubungi klien.
Model strategi adalah model yang sederhana dan umum digunakan. Ketika kita berkembang, kita sering menggunakannya dengan sengaja atau tidak sengaja. Secara umum, model strategi tidak akan digunakan sendiri, dan lebih umum untuk menggunakannya secara campuran dengan mode metode templat, mode pabrik, dll.