10.1. Template Method Pattern
Tujuan dari template method adalah:
Menggambarkan kerangka algoritma dalam sebuah operasi sehingga meminimalisir beberapa langkah subclass. Subclasss dapat mendefinisikan algoritma tertentu tanpa harus mengubah struktur algoritmanya.
Method template pattern mendefinisikan kerangka program algoritma. Satu atau lebih dari langkah-langkah algoritma dapat diganti oleh subclass yang berbeda untuk memungkinkan perilaku sambil memastikan bahwa algoritma menyeluruh masih diikuti.
Dalam pemrograman berorientasi obyek, pertama kelas yang dibuat yang menyediakan langkah-langkah dasar dari desain algoritma. Langkah-langkah ini diimplementasikan dengan menggunakan metode abstrak. Kemudian, subclass mengubah metode abstrak untuk melaksanakan tindakan nyata. Dengan demikian, algoritma umum disimpan di satu tempat namun langkah-langkah konkret dapat diubah oleh subclass.
Metode Template dengan demikian mengelola gambar yang lebih besar dari semantik tugas, dan rincian pelaksanaan lebih halus seleksi dan urutan metode. Ini gambar yang lebih besar memanggil metode abstrak dan non-abstrak untuk tugas di tangan. Non-metode abstrak yang sepenuhnya dikendalikan oleh metode template tetapi metode abstrak, diimplementasikan dalam subclass, memberikan kekuatan ekspresif pola dan derajat kebebasan. Beberapa atau semua metode abstrak dapat khusus dalam subclass, yang memungkinkan penulis subclass untuk menyediakan perilaku tertentu dengan modifikasi minimal untuk semantik yang lebih besar. Metode template (yang non-abstrak) tetap tidak berubah dalam pola ini, memastikan bahwa non-abstrak bawahan metode dan metode abstrak disebut dalam urutan awalnya ditujukan.
Metode template yang sering terjadi, setidaknya dalam kasus yang paling sederhana, dimana metode panggilan hanya satu metode abstrak, dengan bahasa berorientasi objek. Jika seorang penulis perangkat lunak menggunakan metode polimorfik sama sekali, pola desain mungkin akibat lebih alami. Hal ini karena metode memanggil fungsi abstrak atau polimorfik hanyalah alasan untuk metode abstrak atau polimorfik. Metode template yang dapat digunakan untuk menambah nilai tunai langsung ke perangkat lunak atau dengan sebuah visi untuk perangkat tambahan di masa depan.
Pola Metode Template sangat terkait dengan pola non-virtual (NVI) Interface. Pola NVI mengakui manfaat dari metode non-abstrak menerapkan metode abstrak bawahan. Ini tingkat tipuan memungkinkan untuk operasi pra dan pasca relatif terhadap operasi abstrak baik segera dan dengan perubahan yang tak terduga di masa depan. Pola NVI dapat digunakan dengan produksi perangkat lunak yang sangat sedikit dan biaya runtime. Banyak kerangka kerja perangkat lunak komersial menggunakan pola NVI.
Metode template menerapkan prinsip variasi GRASP Lindung, seperti pola Adapter tidak. Perbedaannya adalah bahwa Adapter memberikan interface yang sama untuk beberapa operasi sementara Metode Template melakukannya hanya untuk satu.
Berikut ini contoh
Code Template Method dalam java:
using System;
namespace DoFactory.GangOfFour.Template.Structural
{
class MainApp
{
static
void Main()
{
AbstractClass aA = new
ConcreteClassA();
aA.TemplateMethod();
AbstractClass aB = new
ConcreteClassB();
aB.TemplateMethod();
// Wait for user
Console.ReadKey();
}
}
abstract class AbstractClass
{
public
abstract void
PrimitiveOperation1();
public
abstract void
PrimitiveOperation2();
//
The "Template method"
public
void TemplateMethod()
{
PrimitiveOperation1();
PrimitiveOperation2();
Console.WriteLine("");
}
}
class ConcreteClassA : AbstractClass
{
public
override void PrimitiveOperation1()
{
Console.WriteLine("ConcreteClassA.PrimitiveOperation1()");
}
public
override void
PrimitiveOperation2()
{
Console.WriteLine("ConcreteClassA.PrimitiveOperation2()");
}
}
class
ConcreteClassB : AbstractClass
{
public
override void
PrimitiveOperation1()
{
Console.WriteLine("ConcreteClassB.PrimitiveOperation1()");
}
public
override void
PrimitiveOperation2()
{
Console.WriteLine("ConcreteClassB.PrimitiveOperation2()");
}
}
}
10.2. Visitor Pattern
Dalam pemrograman berorientasi obyek dan rekayasa
perangkat lunak, visitor pattern adalah cara untuk memisahkan algoritma dari
struktur objek yang beroperasi. Hasil praktis dari pemisahan ini adalah
kemampuan untuk menambahkan operasi baru untuk struktur obyek yang sudah ada
tanpa memodifikasi struktur tersebut. Ini adalah salah satu cara untuk dengan
mudah mengikuti prinsip terbuka / tertutup.
Intinya, pengunjung memungkinkan seseorang untuk
menambahkan fungsi virtual baru untuk sebuah kelompok kelas tanpa memodifikasi
kelas sendiri, melainkan seseorang menciptakan kelas pengunjung yang
mengimplementasikan semua spesialisasi yang tepat dari fungsi virtual.
Pengunjung mengambil referensi misalnya sebagai masukan, dan
mengimplementasikan tujuan melalui pengiriman ganda.
Berikut ini contoh
Code Visitor dalam java:
using System;
using System.Collections.Generic;
namespace
DoFactory.GangOfFour.Visitor.Structural
{
class MainApp
{
static void Main()
{
// Setup structure
ObjectStructure o = new
ObjectStructure();
o.Attach(new ConcreteElementA());
o.Attach(new ConcreteElementB());
// Create visitor objects
ConcreteVisitor1 v1 = new
ConcreteVisitor1();
ConcreteVisitor2 v2 = new
ConcreteVisitor2();
// Structure accepting visitors
o.Accept(v1);
o.Accept(v2);
// Wait for user
Console.ReadKey();
}
}
abstract class Visitor
{
public abstract void VisitConcreteElementA(
ConcreteElementA concreteElementA);
public abstract void VisitConcreteElementB(
ConcreteElementB concreteElementB);
}
class ConcreteVisitor1
: Visitor
{
public override void VisitConcreteElementA(
ConcreteElementA concreteElementA)
{
Console.WriteLine("{0}
visited by {1}",
concreteElementA.GetType().Name,
this.GetType().Name);
}
public override void VisitConcreteElementB(
ConcreteElementB concreteElementB)
{
Console.WriteLine("{0}
visited by {1}",
concreteElementB.GetType().Name,
this.GetType().Name);
}
}
class ConcreteVisitor2
: Visitor
{
public override void VisitConcreteElementA(
ConcreteElementA concreteElementA)
{
Console.WriteLine("{0}
visited by {1}",
concreteElementA.GetType().Name,
this.GetType().Name);
}
public override void VisitConcreteElementB(
ConcreteElementB concreteElementB)
{
Console.WriteLine("{0}
visited by {1}",
concreteElementB.GetType().Name,
this.GetType().Name);
}
}
abstract class Element
{
public abstract void Accept(Visitor
visitor);
}
class ConcreteElementA
: Element
{
public override void Accept(Visitor
visitor)
{
visitor.VisitConcreteElementA(this);
}
public void OperationA()
{
}
}
class ConcreteElementB
: Element
{
public override void Accept(Visitor
visitor)
{
visitor.VisitConcreteElementB(this);
}
public void
OperationB()
{
}
}
class ObjectStructure
{
private List<Element> _elements = new
List<Element>();
public void Attach(Element element)
{
_elements.Add(element);
}
public void Detach(Element element)
{
_elements.Remove(element);
}
public void Accept(Visitor visitor)
{
foreach (Element
element in _elements)
{
element.Accept(visitor);
}
}
}
}
Tidak ada komentar:
Posting Komentar