4.1.
Decorator Patterns
Maksud
dari pola ini adalah dengan menambahkan tanggung jawab tambahan secara dinamis
untuk objek. Memperluas fungsionalitas obyek bisa dilakukan secara statis (pada
saat kompilasi) dengan menggunakan warisan namun mungkin diperlukan untuk
memperluas fungsi suatu objek secara dinamis (saat runtime) sebagai objek yang
digunakan. Pola dekorator berlaku ketika ada kebutuhan untuk secara dinamis
menambahkan serta menghapus tanggung jawab ke kelas, dan ketika subclassing
tidak mungkin karena jumlah besar dari subclass yang dapat terjadi. Tujuan dari decorator pattern adalah menciptakan suatu mata rantai
objek, dimana setiap objek mempunyai
object responsible pada fungsi objek
berikutnya. Konteks dari pola ini adalah diinginkan untuk memperkaya
behaviour dari suatu class, objek komponen terdekorasi bisa digunakan sama seperti objek komponen biasa,
tanggung
jawab dari proses dekorasi tidak diinginkan
ada pada class komponen,
kemungkinan
ada proses dekorasi yang ditambahkan di masa depan yang tak bisa diperkirakan
dan harus diantisipasi.
Tujuan
Pattern ini adalah menciptakan suatu
mata rantai object, dimana setiap object mempunyai objects responsible pada
fungsi objek berikutnya.( The Decorator attaches additional responsibilities to an
object dynamically.)
- Komponen - Interface untuk benda yang dapat memiliki tanggung jawab ditambahkan kepada mereka secara dinamis.
- ConcreteComponent - Mendefinisikan sebuah objek yang tanggung jawab tambahan dapat ditambahkan.
- Dekorator - Menjaga referensi ke objek Komponen dan mendefinisikan antarmuka yang sesuai dengan antarmuka Komponen ini.
- Dekorator Beton - Beton dekorator memperluas fungsionalitas komponen dengan menambahkan negara atau menambahkan perilaku.
Contoh Code dalam decorator pattern
dalam java:
publicclass DecoratorBefore {
staticclass A {publicvoiddoIt() { System.out.print('A'); } }
staticclass AwithX extends A {
publicvoiddoIt() {super.doIt(); doX(); }
privatevoiddoX() { System.out.print('X'); }
}
staticclass AwithY extends A {
publicvoiddoIt() {super.doIt(); doY(); }
publicvoiddoY() { System.out.print('Y'); }
}
staticclass AwithZ extends A {
publicvoiddoIt() {super.doIt(); doZ(); }
publicvoiddoZ() { System.out.print('Z'); }
}
staticclass AwithXY extends AwithX {
privateAwithY obj =newAwithY();
publicvoiddoIt() {
super.doIt();
obj.doY();
} }
staticclass AwithXYZ extends AwithX {
privateAwithY obj1 =newAwithY();
privateAwithZ obj2 =newAwithZ();
publicvoiddoIt() {
super.doIt();
obj1.doY();
obj2.doZ();
} }
publicstaticvoidmain( String[] args ) {
A[] array = {newAwithX(),newAwithXY(),newAwithXYZ() };
for(inti=0; i < array.length; i++) {
array[i].doIt();
System.out.print(" ");
} } }
Hasil:
4.2. Façade Pattern
Menyediakan antarmuka yang seragam
untuk satu set antarmuka dalam sebuah subsistem. Facade mendefinisikan
antarmuka tingkat yang lebih tinggi yang membuat subsistem yang lebih mudah
digunakan. Memungkus subsistem yang rumit dengan antarmuka sederhana. Masalah
yang sering terjadi dalam pola ini adalah klien membutuhkan antarmuka yang disederhanakan
untuk fungsi secara keseluruhan dari subsistem yang kompleks. Tujuan dari
façade patterns adalah:
Ø Mendefinisikan interface tingkatan
yang lebih tinggi sehingga subsystem lebih mudah digunakan.
Ø Menyediakan unifikasi interface pada sekumpulan interface yang terdapat pada
sebuah subsystem, dimana façade akan mendefiniskan interface tingkatan yang
lebih tinggi sehingga subsystem lebih muda digunakan dengan menguraikan system
kedalam subsystem untuk mengatasi kompleksitas sebuah system.
Contoh Façade pattern dalam Java:
// 1. Subsystem
class PointCarte {
privatedoublex, y;
publicPointCarte(doublexx,doubleyy ) {
x = xx;
y = yy;
}
publicvoidmove(intdx,intdy ) {
x += dx;
y += dy;
}
publicString toString() {
return"("+ x +","+ y +")";
}
publicdoublegetX() {
returnx;
}
publicdoublegetY() {
returny;
}
}
// 1. Subsystem
class PointPolar {
privatedoubleradius, angle;
publicPointPolar(doubler,doublea ) {
radius = r;
angle = a;
}
publicvoidrotate(intang ) {
angle += ang %360;
}
publicString toString() {
return"["+ radius +"@"+ angle +"]";
}
}
// 1. Desired interface: move(), rotate()
class Point {
privatePointCarte pc;// 2. Design a "wrapper" class
publicPoint(doublexx,doubleyy ) {
pc =newPointCarte( xx,yy );
}
publicString toString() {
returnpc.toString();
}
// 4. Wrapper maps
publicvoidmove(intdx,intdy ) {
pc.move( dx,dy );
}
publicvoidrotate(intangle, Point o ) {
doublex = pc.getX() - o.pc.getX();
doubley = pc.getY() - o.pc.getY();
PointPolar pp =newPointPolar( Math.sqrt(x*x+y*y),
Math.atan2(y,x)*180/Math.PI );
// 4. Wrapper maps
pp.rotate( angle );
System.out.println(" PointPolar is "+ pp );
String str = pp.toString();inti = str.indexOf('@');
doubler = Double.parseDouble( str.substring(1,i) );
doublea = Double.parseDouble( str.substring(i+1,str.length()-1) );
pc =newPointCarte(r*Math.cos(a*Math.PI/180) + o.pc.getX(),
r*Math.sin(a*Math.PI/180) + o.pc.getY() );
}
}
class Line {
privatePoint o, e;
publicLine( Point ori, Point end ) {
o = ori;
e = end;
}
publicvoidmove(intdx,intdy ) {
o.move( dx, dy );
e.move( dx, dy );
}
publicvoidrotate(intangle ) {
e.rotate( angle, o );
}
publicString toString() {
return"origin is "+ o +", end is "+ e;
}
}
class FacadeDemo {
publicstaticvoidmain( String[] args ) {
// 3. Client uses the Facade
Line line1 =newLine(newPoint(2,4),newPoint(5,7) );
line1.move(-2,-4);
System.out.println("after move: "+ line1 );
line1.rotate(45);
System.out.println("after rotate: "+ line1 );
Line line2 =newLine(newPoint(2,1),newPoint(2.866,1.5) );
line2.rotate(30);
System.out.println("30 degrees to 60 degrees: "+ line2 );
}
}
Hasil Compiling:


Tidak ada komentar:
Posting Komentar