Selasa, 10 Juli 2012

Modul 10 - Behavioral Patterns (Template Method, Visitor)


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);
      }
    }
  }
}

0 komentar:

Posting Komentar

About Me

Foto Saya
Tian | Blog's
Banyuwangi, Jawa Timur, Indonesia
gak keren tapi menarik, kadang jutek tapi baik, :D
Lihat profil lengkapku
Tian Septian 15 Desember jam 16:11 Laporkan
widget