Untuk menggunakan pola keadaan dan kebijakan dengan benar dalam aplikasi Java, pengembang perlu mengetahui dengan jelas perbedaan antara kedua pola tersebut. Meskipun struktur mode negara dan mode kebijakan sangat mirip, mereka juga mengikuti prinsip pembukaan dan penutupan, mewakili 'O' dari prinsip desain yang solid, niat mereka sangat berbeda. Pola kebijakan di Java adalah merangkum satu set algoritma terkait, memberikan penelepon fleksibilitas runtime. Penelepon dapat memilih algoritma yang berbeda saat runtime tanpa memodifikasi kelas konteks menggunakan kebijakan. Contoh klasik menggunakan pola kebijakan termasuk implementasi algoritma enkripsi, algoritma kompresi, dan algoritma penyortiran. Di sisi lain, mode negara menggunakan objek untuk menunjukkan perilaku yang berbeda di berbagai negara. Objek di dunia nyata juga memiliki negara bagian, dan mereka akan berperilaku berbeda menurut negara bagian mereka. Misalnya, mesin penjual otomatis hanya dapat menjual barang dalam keadaan hascoin. Jika Anda tidak memasukkan koin, itu tidak akan menjual barang. Sekarang Anda dapat dengan jelas melihat perbedaan antara mode kebijakan dan mode negara, tujuannya berbeda. Mode negara membantu suatu objek mengelola statusnya, sementara mode kebijakan memungkinkan klien untuk memilih perilaku yang berbeda. Perbedaan lain yang tidak mudah dilihat adalah siapa yang mendorong perubahan perilaku. Dalam mode kebijakan, ini didorong oleh klien, yang menyediakan kebijakan yang berbeda untuk informasi konteks. Dalam mode negara, migrasi negara dikelola oleh konteks atau objek negara itu sendiri. Demikian pula, jika Anda memodifikasi status dalam objek negara, ia harus memiliki referensi ke konteks, yang berarti bahwa untuk mesin penjual otomatis, ia dapat memanggil metode SetState untuk memodifikasi keadaan konteks saat ini. Di sisi lain, objek kebijakan tidak memiliki referensi ke konteks, dan kliennya meneruskan kebijakan yang dipilih ke konteks. Strategi dan pola negara adalah pertanyaan wawancara termudah tentang pola desain java. Dalam artikel ini tentang pola desain java, kami akan memperkenalkan ini secara rinci. Kami akan mengeksplorasi persamaan dan perbedaan antara kedua mode, yang akan membantu meningkatkan pemahaman Anda tentang kedua mode tersebut.
Kesamaan antara mode negara dan mode kebijakan:
Jika Anda melihat grafik UML dari pola kebijakan dan pola negara, mereka terlihat sangat mirip. Dalam mode negara, objek yang menggunakan objek negara untuk mengubah perilaku disebut objek konteks. Demikian pula, dalam mode strategi, objek yang menggunakan objek strategi untuk mengubah perilaku juga merupakan objek konteks. Ingat, klien berinteraksi dengan objek konteks. Dalam mode negara, konteks proxys Metode panggilan objek negara. Objek saat ini dalam konteks adalah objek negara spesifik. Dalam mode kebijakan, konteks mengoperasikan juga objek kebijakan. Objek ini dilewatkan sebagai parameter atau disediakan saat membuat objek konteks.
Mari kita lihat beberapa kesamaan antara dua pola desain java inti ini:
Baik mode negara dan mode kebijakan mudah untuk menambah negara atau kebijakan baru tanpa mempengaruhi penggunaan keduanya mengikuti prinsip desain pembukaan dan penutupan, yang berarti desain Anda terbuka untuk ekstensi dan tertutup untuk modifikasi. Dalam dua mode ini, konteks ditutup untuk modifikasi, dan menambahkan negara baru atau kebijakan. Anda tidak perlu memodifikasi objek konteks di negara bagian lain, atau hanya membutuhkan perubahan kecil. Sama seperti objek konteks dalam mode negara akan memiliki keadaan awal, konteks dalam mode kebijakan biasanya juga memiliki kebijakan default.
Mode keadaan merangkum perilaku yang berbeda dengan cara objek negara yang berbeda, sedangkan mode kebijakan merangkum perilaku yang berbeda dengan cara objek kebijakan yang berbeda.
Kedua pola bergantung pada subkelas tertentu untuk mencapai perilaku tertentu. Setiap kebijakan spesifik meluas dari kelas kebijakan abstrak, dan masing -masing negara juga merupakan antarmuka yang digunakan untuk mewakili negara atau subkelas dari kelas abstrak.
Contoh mode negara
WindowState kelas publik {private string statevalue; WindowState publik (string statevalue) {this.stateValue = statevalue; } public String getStateValue () {return statevalue; } public void setStateValue (string statevalue) {this.stateValue = statevalue; } public void handle () { /** Lakukan operasi yang berbeda sesuai dengan keadaan yang berbeda, dan kemudian beralih status* / if ("window" .Equals (statevalue)) {switchWindow (); this.stateValue = "layar penuh"; } else if ("fullscreen" .equals (statevalue)) {switchfullscreen (); this.stateValue = "window"; }} private void switchWindow () {System.out.println ("Switch ke window state"); } private void switchfullScreen () {System.out.println ("Switch ke status layar penuh"); }} / *** Penggunaan state*/ kelas publik WindowContext {private windowState state; windowcontext publik (status windowstate) {this.state = state; } public windowState getState () {return state; } public void setState (windowState state) {this.state = state; } public void switchState () {this.state.handle (); }} /** Mode Mode (Negara) Mode Perilaku* Mengubah keadaan objek dan perilaku objek* Menurut negara, ubah perilaku*/ tes kelas publik {public static void main (string [] args) {/** Hanya ada dua nilai negara dalam contoh ini, yang dikendalikan oleh kelas negara itu sendiri* Anda juga dapat mengontrol nilai negara dan menyerahkan klien untuk mengatur* context.switchstate (); context.switchstate (); context.switchstate (); context.switchstate (); context.switchstate (); context.switchstate (); }}Mencetak
Beralih ke status jendela ke status layar penuh ke status jendela ke status layar penuh
Contoh Mode Kebijakan
/ *** Promosi Produk* Kategori ini adalah: Pengumpulan Tunai*/ Antarmuka Publik IcashSuper {Double AcceptCash (uang ganda); } / ** * Pengumpulan Tunai Normal * @Author Stone * */ Kelas Publik Cashnormal mengimplementasikan IcashSuper {@Override public double acceptCash (uang ganda) {return money; }} / ** * Uang tunai dikumpulkan dengan diskon * @author stone * */ kelas publik CashRebate mengimplementasikan icashsuper {private double rebate; // Diskon Publik CashRebate (rabat ganda) {this.rebate = rabat; } @Override public double acceptCash (uang ganda) {return baru BigDecimal (uang * rabat / 10) .setscale (2, BigDecimal.round_half_up) .doublevalue (); }} / ** * Rabat tunai dengan uang tunai * @author stone * */ kelas publik CashReturn mengimplementasikan iCashSuper {private double moneycondition; // Cashback Jumlah Minimum Private Double Returnmoney; // Jumlah pengembalian CashReturn publik (MoneyCondition Ganda, Double ReturnMoney) {this.moneycondition = MoneyCondition; this.returnmoney = returnmoney; } @Override public double acceptCash (uang ganda) {// ganda rabat if (money> = moneyCondition) {return money - math.floor (uang/moneyCondition) * returnMoney; } else {return money; }}} / *** Jalankan perilaku yang sesuai berdasarkan kelas kebijakan yang diteruskan*/ kelas publik CashContext {private icashsuper casher; public cashContext () {} public cashContext (icashSuper casher) {this.casher = casher; } public void setCasher (icashsuper casher) {this.casher = casher; } // Menurut objek kebijakan spesifik, perilaku algoritma menyebutnya publik ganda acceptCash (uang ganda) {return this.casher.acceptCash (uang); }} tes kelas publik {public static void main (string [] args) {double money = 998; // Harga Asli CashContext CashContext = New CashContext (New CashNormal ()); System.out.println ("Harga Asli:" + CashContext.acceptCash (uang)); // Strategi Umum CashContext.SetCasher (CashRebate baru (8.5)); System.out.println ("Diskon 85%:" + CashContext.acceptCash (uang)); // Strategi Diskon Diskon 85% CashContext.SetCasher (CashReturn baru (300, 50)); System.out.println ("Kembali 50 jika lebih dari 300:" + CashContext.acceptCash (uang)); // strategi cashback 50 Jika lebih dari 300}}Mencetak
Harga Asli: 998.0 85% Diskon: 848.3 Rabat untuk 50: 848.0 Lebih dari 300
Perbedaan antara mode kebijakan dan mode keadaan
Kami telah belajar bahwa kedua polanya sangat mirip dalam struktur, tetapi mereka masih memiliki bagian yang berbeda. Mari kita lihat beberapa perbedaan utama di antara mereka.
Ini adalah semua perbedaan antara pola kebijakan dan pola negara di Java. Seperti yang saya katakan, mereka terlihat sangat mirip dalam diagram UML, keduanya mengikuti prinsip perilaku membuka dan menutup dan merangkum. Mode kebijakan digunakan untuk merangkum algoritma atau kebijakan. Ini akan disediakan untuk objek konteks sebagai parameter atau objek kombinasi saat runtime, sedangkan mode status digunakan untuk mengelola migrasi keadaan.