Cara menggunakan pola desain Memento di C #

Kami menggunakan pola desain untuk memecahkan masalah desain umum dan mengurangi kerumitan dalam kode sumber kami. Pola desain Memento adalah pola desain perilaku yang dapat digunakan untuk menyediakan kemampuan undo atau rollback dalam aplikasi, atau hanya untuk mengatur ulang status objek dalam aplikasi web ASP.Net, misalnya. Dengan menyimpan status objek ke lokasi eksternal yang disebut Memento, pola ini memungkinkan status tersebut dipulihkan ke objek di lain waktu. Mari jelajahi bagaimana kita bisa menggunakan pola desain Memento di C #.

Setiap benda memiliki keadaan internalnya. A Memento memberi kita cara untuk menyelamatkan keadaan itu dan memulihkannya sambil tetap mematuhi prinsip-prinsip enkapsulasi, yang menentukan bahwa anggota non-publik dari sebuah instance kelas tidak boleh tersedia untuk dunia luar. Ini karena Memento hanya tersedia untuk objek yang statusnya telah disimpan.

Peserta dalam pola desain Memento termasuk Memento, Originator, dan Caretaker. Saat kelas Memento menyimpan status objek, Originator membuat Memento dan menggunakannya untuk memulihkan status saat diperlukan. Pengurus hanya bertanggung jawab untuk menyimpan Memento — tidak seharusnya mengubah instance Memento. 

Menerapkan pola Memento 

Pada bagian ini kita akan mengimplementasikan pola desain Memento di C #. Kami akan membuat program sederhana yang memiliki tiga kelas - Calculatorkelas, Mementokelas, dan klien, yaitu Mainmetode.

Lihat Calculatorkelas yang diberikan di bawah ini.

    Kalkulator kelas publik

    {

        hasil int;

        Kalkulator publik (int i = 0)

        {

            hasil = 0;

        }

        public void SetResult (int i = 0)

        {

            this.result = 0;

        }

        public void Add (int x)

        {

            hasil + = x;

        }

        public void Kurangi (int x)

        {

            hasil - = x;

        }

        public int GetResult ()

        {

            hasil pengembalian;

        }

        publik Memento CreateMemento ()

        {

            Memento kenang-kenangan = new Memento ();

            memento.SetState (result);

            mengembalikan kenang-kenangan;

        }

        public void SaveState (Memento kenang-kenangan)

        {

            hasil = memento.GetState ();

        }

    }

Catat metode CreateMementodan SetMementodi Calculatorkelas. Sementara yang pertama membuat sebuah Momentoinstance, yang terakhir mengambil status yang disimpan dan memberikan nilainya kembali ke variabel hasil.

Kelas Memento

The Mementokelas berisi dua metode, SetStatedan GetState. Sementara yang pertama digunakan untuk menyimpan informasi negara, yang terakhir digunakan untuk mengambil status yang disimpan.

kelas publik Memento

    {

        int negara;

        public int GetState ()

        {

            negara kembali;

        }

        public void SetState (negara int)

        {

            this.state = state;

        }

    }

Klien dalam contoh ini adalah Mainmetode yang membuat instance Calculatorkelas dan membuat panggilan ke Adddan Subtractmetode untuk melakukan komputasi. Selain itu, Mainmenyimpan informasi negara di checkpoint tertentu dengan melakukan panggilan ke SaveStatemetode tersebut. Kemudian, status yang disimpan ini dipulihkan dan nilai variabel hasil ditampilkan di jendela konsol. Ini diilustrasikan dalam potongan kode yang diberikan di bawah ini.

        static void Main (string [] args)

        {

            Kalkulator kalkulator = Kalkulator baru ();

            kalkulator.Tambahkan (5);

            kalkulator. Tambahkan (10);

            kalkulator.Kurangi (10);

            Memento checkPoint = kalkulator.CreateMemento ();

            kalkulator.Tambahkan (100);

            Console.WriteLine (“Nilai variabel hasil adalah:“ + calculator.GetResult ());

            kalkulator.SaveState (checkpoint);

            Console.WriteLine (“Nilai variabel hasil pada checkpoint pertama adalah:“ + calculator.GetResult ());

            Console.Read ();

        }

Contoh pola Memento lengkap

Berikut adalah program lengkap untuk referensi Anda.

Program kelas

    {

        static void Main (string [] args)

        {

            Kalkulator kalkulator = Kalkulator baru ();

            kalkulator.Tambahkan (5);

            kalkulator. Tambahkan (10);

            kalkulator.Kurangi (10);

            Memento checkPoint = kalkulator.CreateMemento ();

            kalkulator.Tambahkan (100);

            Console.WriteLine (“Nilai variabel hasil adalah:“ + calculator.GetResult ());

            kalkulator.SaveState (checkpoint);

            Console.WriteLine (“Nilai variabel hasil pada checkpoint pertama adalah:“ + calculator.GetResult ());

            Console.Read ();

        }

    }

    Kalkulator kelas publik

    {

        hasil int;

        Kalkulator publik (int i = 0)

        {

            hasil = 0;

        }

        public void SetResult (int i = 0)

        {

            this.result = 0;

        }

        public void Add (int x)

        {

            hasil + = x;

        }

        public void Kurangi (int x)

        {

            hasil - = x;

        }

        public int GetResult ()

        {

            hasil pengembalian;

        }

        publik Memento CreateMemento ()

        {

            Memento kenang-kenangan = new Memento ();

            memento.SetState (result);

            mengembalikan kenang-kenangan;

        }

        public void SetMemento (Memento kenang-kenangan)

        {

            hasil = memento.GetState ();

        }

    }

    kelas publik Memento

    {

        int negara;

        public int GetState ()

        {

            negara kembali;

        }

        public void SetState (negara int)

        {

            this.state = state;

        }

    }

Pola desain Memento memberi kita cara praktis untuk menyimpan dan mengambil status objek. Anda dapat memanfaatkan pola ini untuk melakukan pengurungan atau rollback. Namun, salah satu kelemahan menggunakan pola ini adalah bahwa proses menyimpan status objek dan memulihkannya nanti dapat memakan waktu cukup lama — misalnya, dapat merusak kinerja aplikasi. Jadi, saat menggunakan pola Memento, pastikan untuk selalu mempertimbangkan performa. Terakhir, pastikan juga bahwa struktur internal objek Anda tidak terpapar ke dunia luar.