Cara menggunakan corak reka bentuk Memento di C #

Kami menggunakan corak reka bentuk untuk menyelesaikan masalah reka bentuk biasa dan mengurangkan kerumitan dalam kod sumber kami. Corak reka bentuk Memento adalah corak reka bentuk tingkah laku yang dapat digunakan untuk memberikan kemampuan undo atau rollback dalam aplikasi, atau hanya untuk menetapkan semula keadaan objek dalam aplikasi web ASP.Net, misalnya. Dengan menyimpan keadaan objek ke lokasi luaran yang disebut Memento, corak ini membolehkan keadaan itu dikembalikan ke objek di lain waktu. Mari terokai bagaimana kita boleh menggunakan corak reka bentuk Memento di C #.

Setiap objek mempunyai keadaan dalamannya. Memento memberi kita cara untuk menyelamatkan keadaan itu dan memulihkannya sambil tetap mematuhi prinsip enkapsulasi, yang menetapkan bahawa anggota kelas awam yang tidak umum tidak boleh tersedia untuk dunia luar. Ini kerana Memento hanya tersedia untuk objek yang keadaannya telah disimpan.

Peserta dalam corak reka bentuk Memento termasuk Memento, Originator, dan Caretaker. Walaupun kelas Memento menyimpan keadaan objek, Originator membuat Memento dan menggunakannya untuk memulihkan keadaan apabila diperlukan. Pengasuh hanya bertanggungjawab untuk menyimpan Memento - tidak seharusnya mengubah contoh Memento. 

Melaksanakan corak Memento 

Di bahagian ini kita akan menerapkan corak reka bentuk Memento di C #. Kami akan membuat program sederhana yang mempunyai tiga kelas - Calculatorkelas, Mementokelas, dan pelanggan, iaitu Mainkaedahnya.

Rujuk Calculatorkelas yang diberikan di bawah.

    Kalkulator kelas awam

    {

        hasil int;

        Kalkulator awam (int i = 0)

        {

            hasil = 0;

        }

        ketetapan awam SetResult (int i = 0)

        {

            ini.hasil = 0;

        }

        kekosongan awam Tambah (int x)

        {

            hasil + = x;

        }

        tolak kekosongan awam (int x)

        {

            hasil - = x;

        }

        awam int GetResult ()

        {

            hasil pulangan;

        }

        awam Memento BuatMemento ()

        {

            Memento memento = Memento baru ();

            memento.SetState (hasil);

            mengembalikan kenang-kenangan;

        }

        awam tidak sah SaveState (Memento memento)

        {

            hasil = memento.GetState ();

        }

    }

Perhatikan CreateMementodan SetMementokaedah di dalam Calculatorkelas. Walaupun yang pertama membuat Momentocontoh, yang terakhir mengambil keadaan yang disimpan dan memberikan nilai kembali ke pemboleh ubah hasil.

Kelas Memento

The Mementokelas mengandungi dua kaedah, SetStatedan GetState. Sementara yang pertama digunakan untuk menyimpan maklumat keadaan, yang terakhir digunakan untuk mengambil keadaan yang disimpan.

kelas awam Memento

    {

        keadaan int;

        awam int GetState ()

        {

            keadaan kembali;

        }

        awam tidak sah SetState (int negeri)

        {

            ini.state = negeri;

        }

    }

Pelanggan dalam contoh ini adalah Mainkaedah yang membuat contoh Calculatorkelas dan membuat panggilan ke Adddan Subtractkaedah untuk melakukan pengiraan. Di samping itu, Mainmenyimpan maklumat keadaan di pusat pemeriksaan tertentu dengan membuat panggilan ke SaveStatekaedah tersebut. Kemudian, keadaan yang disimpan ini dipulihkan dan nilai pemboleh ubah hasil dipaparkan di tetingkap konsol. Ini digambarkan dalam coretan kod yang diberikan di bawah.

        kekosongan statik Utama (string [] args)

        {

            Kalkulator kalkulator = Kalkulator baru ();

            kalkulator. Tambah (5);

            kalkulator. Tambah (10);

            kalkulator.Kurang (10);

            Titik semak Memento = kalkulator.CreateMemento ();

            kalkulator. Tambah (100);

            Console.WriteLine ("Nilai pemboleh ubah hasil adalah:" + calculator.GetResult ());

            kalkulator.SaveState (checkpoint);

            Console.WriteLine ("Nilai pemboleh ubah hasil di pusat pemeriksaan pertama adalah:" + calculator.GetResult ());

            Konsol. Baca ();

        }

Contoh corak Memento yang lengkap

Berikut adalah program lengkap untuk rujukan anda.

Program kelas

    {

        kekosongan statik Utama (string [] args)

        {

            Kalkulator kalkulator = Kalkulator baru ();

            kalkulator. Tambah (5);

            kalkulator. Tambah (10);

            kalkulator.Kurang (10);

            Titik semak Memento = kalkulator.CreateMemento ();

            kalkulator. Tambah (100);

            Console.WriteLine ("Nilai pemboleh ubah hasil adalah:" + calculator.GetResult ());

            kalkulator.SaveState (checkpoint);

            Console.WriteLine ("Nilai pemboleh ubah hasil di pusat pemeriksaan pertama adalah:" + calculator.GetResult ());

            Konsol. Baca ();

        }

    }

    Kalkulator kelas awam

    {

        hasil int;

        Kalkulator awam (int i = 0)

        {

            hasil = 0;

        }

        ketetapan awam SetResult (int i = 0)

        {

            ini.hasil = 0;

        }

        kekosongan awam Tambah (int x)

        {

            hasil + = x;

        }

        tolak kekosongan awam (int x)

        {

            hasil - = x;

        }

        awam int GetResult ()

        {

            hasil pulangan;

        }

        awam Memento BuatMemento ()

        {

            Memento memento = Memento baru ();

            memento.SetState (hasil);

            mengembalikan kenang-kenangan;

        }

        kekosongan awam SetMemento (Memento memento)

        {

            hasil = memento.GetState ();

        }

    }

    kelas awam Memento

    {

        keadaan int;

        awam int GetState ()

        {

            keadaan kembali;

        }

        awam tidak sah SetState (int negeri)

        {

            ini.state = negeri;

        }

    }

Corak reka bentuk Memento memberi kita cara yang berguna untuk menyimpan dan mendapatkan keadaan objek. Anda boleh memanfaatkan corak ini untuk membuat pembatalan atau pengguliran. Namun, salah satu kelemahan menggunakan corak ini adalah bahawa proses menyelamatkan keadaan objek dan memulihkannya nanti dapat memakan waktu yang cukup lama - iaitu, ia mungkin memudaratkan prestasi aplikasi. Oleh itu, semasa menggunakan corak Memento, pastikan prestasi sentiasa diingat. Akhir sekali, pastikan juga bahawa struktur dalaman objek anda tidak terdedah kepada dunia luar.