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.
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:
Tidak ada komentar:
Posting Komentar