Senin, 28 November 2016

Design Pattern - Observer

Kali ini saya akan membahas tentang Desain Pattern yang ada pada Object Oriented Programming (OOP), ada berbagai macam jenis Design pattern yang ada namun kali ini saya akan lebih membahas tentang observer design pattern.

Sebelum masuk ke observer, mari kita ketahui apa itu design pattern. Design Pattern adalah sebuah solusi atas sebuah problem yang seringkali muncul dan berulang ulang. Bentuknya bukan sebuah source code melainkan sebuah desain/konsep yang langsung dapat ditransformasikan ke dalam sebuah bahasa pemrograman. Design Pattern seperti sebuah panutan terbaik untuk programmer dalam menyelesaikan masalah2 yang ada dalam software developing.

Lanjut pada Design Pattern Observer, seperti namanya observer merupakan sebuah desain dimana si observer ini akan selalu melihat kepada Subject nya, dimana jika sang subject terdapat perubahan maka observer akan membroadcast perubahannya kepada anak2nya jadi hubungan observer dan subjectnya adalah one-to-many.

Observer scheme

ALGORITMA OBSERVER DESIGN PATTERN
  1. Modelkan fungsi yang "independent/berdiri sendiri" dengan abstraksi "subject" 
  2. Modelkan fungsi yang "dependent/bergantung" dengan hirarki "observer"
  3. Subject hanya dipasangkan dengan base class dari observer
  4. Observers menghubungkan diri dengan class subject
  5. Subject akan membroadcast update kepada observer yang telah terhubung
  6. Observer menarik/mencari informasi pada subject
  7. Programmer menentukan banyak dan tipe observer

DEMO
Pada demo kali ini, saya akan membuat sebuah observer pada operasi matematika.
1. Modelkan Subject
class Subject {
    vector < class Observer * > views; // 3. Subject hanya dipasangkan dengan base class observer
    int value;
  public:
    void attach(Observer *obs) {
        views.push_back(obs);
    }
    void setVal(int val) {
        value = val;
        notify();
    }
    int getVal() {
        return value;
    }
    void notify();
};     

2. Modelkan Observer
class Observer {
    Subject *model;
    int denom;
  public:
    Observer(Subject *mod, int div) {
        model = mod;
        denom = div;
        // 4. Observers menghubungkan diri dengan Subject
        model->attach(this);
    }
    virtual void update() = 0;
  protected:
    Subject *getSubject() {
        return model;
    }
    int getDivisor() {
        return denom;
    }
};

3. Membuat Broadcaster
void Subject::notify() {
  for (int i = 0; i < views.size(); i++)
    views[i]->update();
} 

4. Membuat Observer Turunan untuk Menarik Suatu Informasi
class DivObserver: public Observer {
  public:
    DivObserver(Subject *mod, int div): Observer(mod, div){}
    void update() {
        int v = getSubject()->getVal(), d = getDivisor();
        cout << v << " div " << d << " is " << v / d << '\n';
    }
};

class ModObserver: public Observer {
  public:
    ModObserver(Subject *mod, int div): Observer(mod, div){}
    void update() {
        int v = getSubject()->getVal(), d = getDivisor();
        cout << v << " mod " << d << " is " << v % d << '\n';
    }
};

5. Fungsi Main dimana kita bisa mengatur berapa dan tipe observer
int main() {
  Subject subj;
  DivObserver divObs1(&subj, 2); 
  DivObserver divObs2(&subj, 3); 
  ModObserver modObs3(&subj, 2);
  subj.setVal(17);
}

6. Hasil Program

Sekian pembahasan kali ini semoga bermanfaat terimakasih

REFERENSI
https://sourcemaking.com/design_patterns/observer
https://en.wikipedia.org/wiki/Software_design_pattern

Trastian Satria Wibowo
5114100016
PPL - E