Rabu, 20 Juni 2012

Modul 8 - Behavioral Patterns (Mementto, Observer)

8.1. Momento Pattern
Maksud dari pola ini adalah untuk menangkap keadaan internal suatu objek tanpa melanggar enkapsulasi dan sehingga memberikan rata-rata untuk mengembalikan objek ke keadaan awal bila diperlukan. Kadang-kadang perlu untuk menangkap keadaan internal suatu objek pada titik tertentu dan memiliki kemampuan untuk mengembalikan objek untuk menyatakan bahwa di kemudian waktu. Kasus seperti ini berguna jika terjadi kesalahan atau kegagalan. Pertimbangkan kasus suatu objek kalkulator dengan operasi undo seperti kalkulator hanya dapat mempertahankan daftar semua operasi sebelumnya yang telah dilakukan dan dengan demikian akan mampu mengembalikan perhitungan sebelumnya telah dilakukan. Hal ini akan menyebabkan objek kalkulator untuk menjadi lebih besar, lebih kompleks, dan kelas berat, sebagai objek kalkulator akan harus menyediakan tambahan membatalkan fungsi dan harus memelihara daftar semua operasi sebelumnya. Fungsi ini dapat pindah dari kelas kalkulator, sehingga eksternal (sebut saja membatalkan kelas manajer) dapat mengumpulkan keadaan internal kalkulator dan menyimpannya. Namun menyediakan akses eksplisit untuk setiap variabel keadaan kalkulator kepada manajer restore akan tidak praktis dan akan melanggar prinsip enkapsulasi.
Gambar di bawah menunjukkan diagram UML kelas untuk Pola Memento:


Tugas Care Taker
§  Menyimpan keadaan internal dari objek Originator. Negara dapat mencakup sejumlah variabel negara.
§  Para Memento harus memiliki dua interface, antarmuka ke juru kunci. Interface ini tidak harus memungkinkan setiap operasi atau akses ke keadaan internal disimpan oleh enkapsulasi penghargaan kenang-kenangan dan dengan demikian. Antarmuka lain adalah dengan originator originator dan memungkinkan untuk mengakses variabel setiap negara perlu untuk pencetus untuk mengembalikan keadaan sebelumnya.
Momento
§  Membuat objek kenang-kenangan menangkap negara pencetus internal.
§  Gunakan benda kenang-kenangan untuk mengembalikan keadaan sebelumnya.
Originator
§  Bertanggung jawab untuk menjaga kenang-kenangan.
§  Para kenang-kenangan suram dalam pengurus, dan pengurus tidak boleh beroperasi di atasnya.
Sebuah Caretaker ingin melakukan operasi pada Originator sementara memiliki kemungkinan untuk rollback. Penjaga memanggil metode createMemento () pada pencetus meminta pengirim untuk menambahkan sebuah objek kenang-kenangan. Pada titik ini originator membuat objek kenang-kenangan saving internal dan melewati kenang-kenangan kepada juru kunci. Pengurus mempertahankan objek kenang-kenangan dan melakukan operasi. Dalam hal kebutuhan untuk membatalkan operasi, penjaga memanggil metode setMemento () pada pencetus melewati objek kenang-kenangan dipertahankan. Originator akan menerima kenang-kenangan, menggunakannya untuk mengembalikan keadaan sebelumnya.
Berikut ini contoh Code Momento dalam java:
Using System;
namespace DoFactory.GangOfFour.Memento.Structural
{
  class MainApp
  {
      static void Main()
    {
      Originator o = new Originator();
      o.State = "On";
       // Store internal state
      Caretaker c = new Caretaker();
      c.Memento = o.CreateMemento();
       // Continue changing originator
      o.State = "Off";
       // Restore saved state
      o.SetMemento(c.Memento);
       // Wait for user
      Console.ReadKey();
    }
  }
   class Originator
  {
    private string _state;

    // Property
    public string State
    {
      get { return _state; }
      set
      {
        _state = value;
        Console.WriteLine("State = " + _state);
      }
    }
     // Creates memento
    public Memento CreateMemento()
    {
      return (new Memento(_state));
    }
     // Restores original state
    public void SetMemento(Memento memento)
    {
      Console.WriteLine("Restoring state...");
      State = memento.State;
    }
  }
  class Memento
  {
    private string _state;
     // Constructor
    public Memento(string state)
    {
      this._state = state;
    }
     // Gets or sets state
    public string State
    {
      get { return _state; }
    }
  }
    class Caretaker
  {
    private Memento _memento;

    // Gets or sets memento
    public Memento Memento
    {
      set { _memento = value; }
      get { return _memento; }
    }
  }
}
Output:
8.2. Observer Pattern
Observer adalah pola desain software dimana suatu objek mempunyai daftar objek yang mamiliki ketergantungan / dependencies. Pola desain Observer dapat digunakan setiap kali subjek harus diamati oleh satu atau lebih Observer. Diasumsikan bahwa kita memiliki stock system yang menyediakan data untuk beberapa jenis client. Penerapan pola desain ini yaitu dengan mengimplementasikan client sebagai aplikasi berbasis web, tapi dalam waktu dekat kita perlu menambahkan client untuk perangkat mobile, Palm maupun pocket PC, atau sistem yang dapat memberi notifikasi kepada user menggunakan pesan singkat. Observable – interface atau kelas abstrak yang mendefinisikan operasi unutk melampirkan dan memisahkan observer ke client. Biasa dikenal sebagai subjek. ConcreteObservable – perwujudan kelas Observable. Mempertahankan state dari suatu objek dan apabila terjadi perubahan, observer akan diberikan notifikasi. Observer – interface atau kelas abstrak yang mendefinisikan operasi yang digunakan untuk memberi notifikasi objek. ConcreteObserverA, ConcreteObserverB – implementasi nyata dari Observer Prinsip dari observer pattern ini adalah ketika ada perubahan status di Subject, maka akan diberitahukan secara otomatis ke Observer (biasanya dengan memanggil suatu method) sehingga Subscriber akan menerima perubahan data seketika. Tujuannya dari Observer pattern adalah mendefiniskan hubungan one-to-many antar  object sehingga ketika sebuah object berubah state-nya, object-object lain yang bergantung juga ikut berubah.
Berikut adalah diagram UML untuk observer pattern:
 

Berikut ini contoh Code Observer dalam java:
using System;
using System.Collections.Generic;
 namespace DoFactory.GangOfFour.Observer.Structural
{
  class MainApp
  {
    static void Main()
    {
      // Configure Observer pattern
      ConcreteSubject s = new ConcreteSubject();

      s.Attach(new ConcreteObserver(s, "X"));
      s.Attach(new ConcreteObserver(s, "Y"));
      s.Attach(new ConcreteObserver(s, "Z"));

      // Change subject and notify observers
      s.SubjectState = "ABC";
      s.Notify();

      // Wait for user
      Console.ReadKey();
    }
  }

  abstract class Subject
  {
    private List<Observer> _observers = new List<Observer>();

    public void Attach(Observer observer)
    {
      _observers.Add(observer);
    }

    public void Detach(Observer observer)
    {
      _observers.Remove(observer);
    }

    public void Notify()
    {
      foreach (Observer o in _observers)
      {
        o.Update();
      }
    }
  }

  class ConcreteSubject : Subject
  {
    private string _subjectState;
     // Gets or sets subject state
    public string SubjectState
    {
      get { return _subjectState; }
      set { _subjectState = value; }
    }
  }
   abstract class Observer
  {
    public abstract void Update();
  }
  class ConcreteObserver : Observer
  {
    private string _name;
    private string _observerState;
    private ConcreteSubject _subject;
     // Constructor
    public ConcreteObserver(
      ConcreteSubject subject, string name)
    {
      this._subject = subject;
      this._name = name;
    }
     public override void Update()
    {
      _observerState = _subject.SubjectState;
      Console.WriteLine("Observer {0}'s new state is {1}",
        _name, _observerState);
    }
     // Gets or sets subject
    public ConcreteSubject Subject
    {
      get { return _subject; }
      set { _subject = value; }
    }
  }
}
Output:






0 komentar:

Posting Komentar