State design pattern



Pengertian

State pattern adalah salah satu bagian dari behavioral design pattern, state pattern ini memungkinkan sebuah objek mengubah prilakunya jika keadaan internalnya berubah.

Dikutip dari buku gang of four book design pattern : 
“Allows an object to alter its behaviour when its internal state changes. The object will appear to change its class.”

Yang artinya, memungkinkan sebuah objek merubah kebiasaannya saat keadaan internalnya berubah, objek tersebut seakan akan merubah kelasnya

State design pattern terdiri dari 3 komponen : 
  1. Context - sebuah kelas yang mempunyai objek state di dalamnya, menunjukkan state (dan perilaku) apa yang sedang digunakan.
  2. State - sebuah interface atau abstrak class yang mendefinisikan karakteristik dasar (properties, method) dari semua objek concreteState
  3. concreteState - sebuah individual class yang mengimplementasikan karakteristik dasar dari kelas interface state, setiap concreteClass memiliki logic dan perilakunya masing masing, dan akan mempengaruhi keadaan objek context.

Tujuan dari state design pattern adalah untuk memungkinkan objek context untuk menyesuaikan perilaku dengan adanya perubahan concreteState ke concreteState lainnya, walaupun dalam hal ini menggunakan if-else juga memungkinkan, namun akan sangat sulit jika harus merubah seluruh struktur program untuk menambahkan sebuah perilaku pada program tersebut, jadi state design pattern sangat memudahkan karena untuk menambahkan sebuah perilaku tinggal membuat kelas concrete baru, dan struktur program akan tetap terjaga 


UML Class Diagram


Kelas context meng-aggregat kelas state, yang berarti ada attribut di kelas context yang bertipe state, dan kelas context dapat memanggil method yang ada di kelas state, kelas state akan menyesuaikan perilakunya dengan menjalakan method tersebut di kelas concreteState tertentu sesuai dengan keadaan internal kelas context. Jika keadaan internal kelas context berubah, maka kelas concreteState yang menjalankan method tersebut juga berubah


Kelebihan


  • Menerapkan konsep polymorphic dengan baik, Mudah untuk menambahkan perilaku dari sebuah objek, karena tinggal menambahkan concrete class yang mengimplementasi state class
  • Merubah perilaku objek saat runtime berdasarkan internal state
  • State design pattern meningkatkan kohesi karena perilaku spesifik ditempatkan di concrete state tertentu dalam kode yang berbeda


Konsekuensi


  • Karena untuk menambahkan perilaku harus menambahkan class concrete sendiri.
  • Keadaan ini merupakan keuntungan dan kerugian dalam waktu yang bersamaan, karena kami memiliki kelas-kelas State yang jelas dan dari sisi lain jumlah kelas bertambah besar.



Implementation

kasus : play button media player


MP3PlayerContext

Kelas MP3PlayerContext ini sebagai kelas Context. Kelas ini menggunakan kelas state menjadi attribut yang berarti kelas MP3PlayerContext meng-anggregat kelas state.

Kelas MP3PlayerContext juga mempunyai method get set seperti biasa, dan juga mempunyai method play() yang berfungsi untuk memanggil method pressPlay() yang ada di kelas state.

State


Kelas state, sesuai namanya, kelas ini sebagai kelas state, kelas ini berbentuk interface yang artinya setiap method yang di deklarasikan tidak akan di implementasikan di class tersebut, namun akan di implementasikan di kelas yang akan meng-implements nya nanti, di kasus ini, yang akan meng-implements kelas ini adalah kelas ConcreteState.

Kelas state ini memiliki 1 method yaitu pressPlay dengan mem-passing attribut bertipekan kelas context mp3PlayerContext yang nantinya kelas tersebut akan di proses di salahsatu kelas concrete untuk dirubah kedaan internalnya

StandbyState & PlayingState

Kelas StandbyState dan PlayingState ini sebagai ConcreteState, kedua kelas ini memiliki perilaku yang berbeda, StandbyState untuk menghentikan lagu sementara, sedangkan PlayingState untuk memutar lagu.
Kedua kelas ini men-implement 1 kelas interface yang sama yaitu kelas State, kedua kelas ini mengimplementasi kelas pressPlay namun dengan cara yang berbeda,

UML Sequence Diagram


Kesimpulan

State design pattern ini berguna untuk sebuah aplikasi yang mempunyai banyak perilaku dalam satu aksi, karena lebih efisien menggunakan pattern ini dibanding menggunakan conditional if-else yang bertangga-tangga

References

JavaBrahman. (2018). State Design Pattern in Java. [online] Available at: https://www.javabrahman.com/design-patterns/state-design-pattern-in-java/ [Accessed 22 Apr. 2018].

Prasad Kharkar. (2016). State Design Pattern Implementation.Available: http://www.thejavageek.com/2016/10/30/state-design-pattern-implementation/. Last accessed 22nd April 2018.

James Sugrue. (2010). State Pattern Tutorial with Java Examples.Available: https://dzone.com/articles/design-patterns-state. Last accessed 22nd April 2018.

Comments

Popular posts from this blog

Cara Memasang GLUT di Dev-C++

ALGORITMA DDA, BRESENHAM, DAN MID-POINT GARIS

ALGORITMA MID-POINT DAN BRESENHAM LINGKARAN SERTA PERBEDAANNYA