Definisi negara: Perilaku yang berbeda, perilaku yang berbeda; atau dengan kata lain, setiap negara memiliki perilaku yang sesuai.
Kapan Menggunakan Mode Status
Mode negara lebih umum digunakan dalam penggunaan aktual dan cocok untuk "switching status". Karena kita sering menggunakan jika lain untuk beralih negara bagian, jika penilaian negara ini diulang, kita perlu memikirkan apakah kita dapat mengadopsi mode negara.
Tidak hanya berdasarkan status, tetapi juga pada atribut. Jika sifat suatu objek berbeda, perilaku objek berbeda. Properti, perubahan tersebut (switching) properti dapat terjadi kapan saja, sehingga dimungkinkan untuk menggunakan status.
Dalam penggunaan aktual, ada banyak status switching yang mirip dengan sakelar, tetapi kadang -kadang tidak begitu jelas, tergantung pada pengalaman dan kedalaman pemahaman Anda tentang sistem.
Apa yang ingin kami jelaskan di sini adalah bahwa ada beberapa perbedaan antara "negara bagian switching" dan "penilaian negara umum".
Salinan kode adalah sebagai berikut:
if (yang == 1) state = "hello";
lain jika (yang == 2) state = "hai";
lain jika (yang == 3) state = "bye";
Ini adalah "penilaian negara umum". Jika diubah menjadi:
Salinan kode adalah sebagai berikut:
if (state.euqals ("bye")) state = "hello";
lain jika (state.euqals ("hello")) state = "hai";
lain jika (state.euqals ("hai")) state = "bye";
Ini adalah "sakelar status switch", yaitu untuk mengganti keadaan dari "halo" ke "hai", dan kemudian untuk "bye"; Status dapat diubah mode status digunakan.
Jika Anda cukup mengganti arah "halo"-> "hai"-> "bye"-> "halo" di atas, Anda tidak perlu menggunakan mode status, karena mode status akan membuat banyak Subkelas.
Silakan lihat contoh berikut:
Salinan kode adalah sebagai berikut:
konteks kelas publik {
keadaan warna pribadi = null;
public void push () {
// Jika keadaan merah saat ini dialihkan ke biru
if (state == color.red) state = color.blue;
// Jika keadaan biru saat ini dialihkan ke hijau
lain jika (state == color.blue) state = color.green;
// Jika keadaan hitam saat ini dialihkan ke merah
lain jika (state == color.black) state = color.red;
// Jika keadaan hijau saat ini dialihkan ke hitam
lain jika (state == color.green) state = color.black;
Sampel sampel = sampel baru (status);
sampel.operate ();
}
public void pull () {
// Ini persis kebalikan dari switching status push if (state == color.green) state = color.blue;
lain jika (state == color.black) state = color.green;
lain jika (state == color.blue) state = color.red;
lain jika (state == color.red) state = color.black;
Sampel2 sampel2 = sampel baru2 (status);
sampel2.operat ();
}
}
Dalam contoh di atas, kami memiliki dua tindakan dorong dan tarik.
Catatan juga: dalam contoh di atas, perubahan keadaan hanyalah penugasan warna yang sederhana. Gunakan.
Misalnya: rekening bank sering beralih antara status terbuka dan keadaan dekat.
Sebagai contoh: TCPConnection klasik, keadaan TCP memiliki tiga negara bagian: membuat penutupan mendengarkan dan konversi berulang.
Misalnya: Akun POP kotak surat akan memiliki empat negara bagian, mulailah nama yang diizinkan untuk berhenti, perilaku yang sesuai dari masing -masing negara bagian harus relatif besar, cocok untuk menggunakan negara.
Misalnya: Memilih alat yang berbeda di kotak alat dapat dianggap beralih di antara berbagai alat, cocok untuk menggunakan status. Misalnya, jika Anda memiliki program gambar tertentu, pengguna dapat memilih alat yang berbeda untuk menggambar Kurva Lurus Kotak.
Cara menggunakan mode status
Negara membutuhkan dua jenis entitas untuk berpartisipasi:
1. Manajer Negara Manajer adalah saklar.
2. Kelas induk yang diimplementasikan oleh kelas atau antarmuka abstrak, keadaan yang berbeda mewarisi berbagai subclass dari kelas induk ini.
Mengambil konteks di atas sebagai contoh, kami ingin memodifikasinya dan membuat dua jenis entitas.
Langkah pertama adalah membuat kelas orang tua:
Salinan kode adalah sebagai berikut:
Status kelas abstrak publik {
Publik abstrak void handpush (konteks C);
Publik abstrak void handpull (konteks C);
abstrak publik void getColor ();
}
Metode dalam kelas induk harus sesuai dengan perilaku sakelar di manajer negara bagian. harus ditangani secara khusus.
Berikut ini adalah implementasi subkelas tertentu:
Salinan kode adalah sebagai berikut:
Bluestate kelas publik meluas state {
publicush public void (konteks c) {
// Menurut metode push "Jika biru, beralih ke hijau";
C.SetState (GreenState baru ());
}
public void handpull (konteks c) {
// Menurut metode tarik "jika berwarna biru, beralih ke merah";
C.SetState (RedState baru ());
}
public abstrak void getColor () {return (color.blue)}
}
Demikian pula, subclass di negara bagian lain diimplementasikan sebagai biru.
Langkah kedua adalah menulis ulang manajer negara, yang merupakan konteks dari contoh ini:
Salinan kode adalah sebagai berikut:
konteks kelas ublic {
State Sate Pribadi = NULL; // Kami mengubah keadaan warna asli menjadi negara bagian yang baru dibuat;
// SetState digunakan untuk mengubah keadaan negara menggunakan setState untuk mencapai switching keadaan
pulic void setState (state state) {
this.state = state;
}
public void push () {
// Rincian switching keadaan dalam hal ini perubahan warna, yang telah dienkapsulasi dalam pegangan subkelas, dan tidak perlu peduli dengan state.handlepush (ini);
// Karena sampel perlu menggunakan hasil switching dalam keadaan, gunakan getColor ()
Sampel sampel = sampel baru (state.getColor ());
sampel.operate ();
}
public void pull () {
state.handlepull (ini);
Sampel2 sampel2 = sampel baru2 (state.getColor ());
sampel2.operat ();
}
}
Pada titik ini, kami telah menerapkan proses refactoring negara.
Di atas hanyalah contoh yang cukup sederhana.