Senin, 07 Mei 2012

Modul 5 - Structural Patterns (Flyweight Pattern, Proxy Pattern)


5.1. Flyweight Pattern
Flyweight Pattern adalah sebuah perangkat lunak desain pattern.  Flyweight pattern adalah sebuah objek yang meminimalkan penggunaan memori dengan berbagi data sebanyak mungkin dengan objek sejenis, yang merupakan cara untuk menggunakan benda-benda dalam jumlah besar ketika representasi diulang sederhana akan menggunakan jumlah yang dapat diterima dari memori. Seringkali beberapa bagian dari negara objek dapat dibagi, dan itu adalah praktek umum untuk menahan mereka dalam struktur data eksternal dan meneruskannya ke objek kelas flyweight sementara ketika mereka digunakan.
Sebuah contoh klasik dari penggunaan pola flyweight adalah struktur data untuk representasi grafis dari karakter dalam pengolah kata. Mungkin diinginkan untuk memiliki, untuk setiap karakter dalam dokumen, sebuah flyweight objek yang mengandung outline font, metrik font, dan data format lain, tapi ini akan berjumlah ratusan atau ribuan byte untuk setiap karakter. Sebaliknya, untuk setiap karakter mungkin ada referensi ke objek mesin flyweight kelas flyweight bersama oleh setiap contoh karakter yang sama dalam dokumen, hanya posisi masing-masing karakter (dalam dokumen dan / atau halaman) akan perlu disimpan secara internal.
Maksud dari pola ini adalah dengan menggunakan berbagi untuk mendukung sejumlah besar objek yang memiliki bagian dari keadaan internal mereka yang sama di mana bagian lain dapat bervariasi.

Diagram UML untuk Pola Flyweight:

*       Flyweight - Mendeklarasikan sebuah interface yang flyweights dapat menerima dan bertindak atas negara ekstrinsik.
*       ConcreteFlyweight - Mengimplementasikan interface kelas terbang dan toko negara intrinsik. Sebuah objek ConcreteFlyweight harus sharable. Obyek kelas terbang Beton harus mempertahankan negara bahwa itu adalah intrinsik untuk itu, dan harus mampu memanipulasi negara yang ekstrinsik. Dalam perang permainan representasi grafis contoh adalah negara intrinsik, dimana lokasi dan kesehatan negara adalah ekstrinsik. Bergerak Prajurit, perilaku gerak memanipulasi keadaan eksternal (lokasi) untuk membuat lokasi baru.
*       FlyweightFactory - Pabrik menciptakan dan mengelola obyek kelas terbang. Selain pabrik memastikan pembagian objek kelas terbang. Pabrik mempertahankan kolam objek yang berbeda kelas terbang dan kembali obyek dari kolam jika sudah dibuat, menambahkan satu ke kolam renang dan mengembalikannya dalam kasus itu adalah baru.
Pada contoh perang pabrik Soldier kelas terbang dapat membuat dua jenis flyweights: sebuah kelas terbang Prajurit, serta kelas terbang Kolonel. Ketika Klien meminta Pabrik untuk seorang prajurit, pabrik memeriksa apakah ada tentara di kolam renang, jika ada, itu dikembalikan ke klien, jika tidak ada tentara di kolam renang, seorang tentara dibuat, ditambahkan ke kolam, dan kembali ke klien, pada saat klien meminta untuk seorang prajurit, prajurit dibuat sebelumnya dikembalikan, tidak ada prajurit baru dibuat.
*       Client - Klien mempertahankan referensi untuk flyweights selain komputasi dan mempertahankan negara ekstrinsik
Pola kelas terbang berlaku untuk program menggunakan sejumlah besar objek yang memiliki bagian dari keadaan internal mereka yang sama di mana bagian lain negara dapat bervariasi. Pola ini digunakan ketika bagian besar negara objek dapat dibuat ekstrinsik (eksternal untuk obyek itu).

Contoh code pola flyweight dalam java:
import java.awt.*;
import java.util.Vector;
 
class ColorBox2 extends Canvas {
   private Color  curColor = getColor();
   private static Color[]  colors = { Color.black, Color.blue, Color.cyan,
      Color.darkGray, Color.gray, Color.green, Color.lightGray, Color.red,
      Color.magenta, Color.orange, Color.pink, Color.white, Color.yellow };
 
   public ColorBox2( ThreadPool2 tp ) {
      tp.register( this );
   }
   private static Color getColor() {
      return colors[ (int)(Math.random() * 1000) % colors.length ];
   }
   public void changeColor() {
      curColor = getColor();
      repaint();
   }
   public void paint( Graphics g ) {
      g.setColor( curColor );
      g.fillRect( 0, 0, getWidth(), getHeight() );
}  }
 
class ThreadPool2 {
   private final int NUM_THREADS = 8;
   private Vector cboxes = new Vector();
   private int    pause;
 
   class HandlerThread extends Thread {
      public void run() {
         while (true) {
            ((ColorBox2) cboxes.elementAt(
               (int)(Math.random()*1000) % cboxes.size() )).changeColor();
            try { Thread.sleep( pause ); } catch( InterruptedException e ) { }
   }  }  }
 
   public ThreadPool2( int p ) {
      pause = p;
   }
   public void register( ColorBox2 r ) {
      cboxes.addElement( r );
   }
   public void start() {
      for (int i=0; i < NUM_THREADS; i++) new HandlerThread().start();
}  }
 
public class ColorBoxes2 {
   public static void main( String[] args ) {
      int size = 8, pause = 10;
      if (args.length > 0) size  = Integer.parseInt( args[0] );
      if (args.length > 1) pause = Integer.parseInt( args[1] );
 
      ThreadPool2 tp = new ThreadPool2( pause );
 
      Frame f = new FrameClose( "ColorBoxes2 - 8 shared HandlerThreads" );
      f.setLayout( new GridLayout( size, size ) );
      for (int i=0; i < size*size; i++) 
         f.add( new ColorBox2( tp ) );
      f.setSize( 500, 400 );
      f.setVisible( true );
      tp.start();
}  }
 Hasil :
 
 

5.2. Proxy Patterns
Kadang kita memerlukan kemampuan untuk mengontrol akses ke suatu objek. Sebagai contoh jika kita perlu menggunakan hanya beberapa metode dari beberapa objek mahal kita akan menginisialisasi objek tersebut ketika kita membutuhkan mereka sama sekali. Sampai saat itu kita dapat menggunakan beberapa benda ringan mengekspos antarmuka yang sama dengan benda berat. Obyek-obyek cahaya disebut proxy dan mereka akan instantiate objek-objek berat ketika mereka benar-benar membutuhkan dan pada saat itu kita akan menggunakan beberapa objek cahaya, bukan. Kemampuan untuk mengontrol akses ke suatu objek dapat diperlukan untuk berbagai alasan: mengendalikan jika benda mahal perlu instantiated dan diinisialisasi, memberikan hak akses yang berbeda untuk objek, serta menyediakan sarana canggih mengakses dan referensi objek berjalan di proses lainnya, pada mesin lain. Maksud dari pola ini adalah untuk menyediakan "Placeholder" untuk sebuah objek untuk mengontrol referensi untuk itu.
Diagram UML untuk Pola Flyweight:
 
Kelas peserta dalam pola proxy:
Ø  Subjek - Antarmuka dilaksanakan oleh RealSubject dan mewakili layanannya. Antarmuka harus dilaksanakan oleh proxy juga sehingga proxy dapat digunakan di setiap lokasi di mana RealSubject dapat digunakan.
Ø  Proxy
§  Menjaga referensi yang memungkinkan proxy untuk mengakses RealSubject tersebut.
§  Mengimplementasikan antarmuka yang sama dilaksanakan oleh RealSubject sehingga proxy dapat diganti untuk RealSubject tersebut.
§  Kontrol akses ke RealSubject dan mungkin bertanggung jawab untuk penciptaan dan penghapusan.
§  Tanggung jawab lain tergantung pada jenis proxy.
Ø  RealSubject - objek nyata yang merupakan proxy.
Pola desain Proxy berlaku jika ada kebutuhan untuk mengontrol akses ke sebuah Object, serta ketika ada kebutuhan untuk referensi canggih untuk sebuah Object. Situasi umum di mana pola proxy yang berlaku adalah:
  • Proxy Virtual menunda penciptaan dan inisialisasi obyek mahal sampai dibutuhkan, di mana objek diciptakan pada permintaan (Misalnya menciptakan objek RealSubject hanya ketika metode doSomething dipanggil).
  • Proxy remote: menyediakan representasi lokal untuk sebuah benda yang berada dalam ruang alamat yang berbeda. Sebuah contoh umum adalah Java RMI objek tulisan rintisan. Tujuan tulisan rintisan bertindak sebagai proxy mana invoking metode pada stub akan menyebabkan stub untuk berkomunikasi dan memanggil metode pada remote object (disebut skeleton) menemukan pada mesin yang berbeda.
  • Proxy Perlindungan: dimana proxy mengontrol akses ke metode RealSubject, dengan memberikan akses ke beberapa objek sementara menolak akses kepada orang lain.
  • Referensi Smart: menyediakan akses yang canggih untuk benda-benda tertentu seperti pelacakan jumlah referensi ke sebuah obyek dan menolak akses jika sejumlah tertentu tercapai, serta memuat objek dari database ke dalam memori pada permintaan.
Contoh code pola proxy dalam Java:
import java.io.*;  import java.net.*;
 
// 5. To support plug-compatibility between
// the wrapper and the target, create an interface
interface SocketInterface {
  String readLine();
  void  writeLine( String str );
  void  dispose();
}
 
public class ProxyDemo {
  public static void main( String[] args ) {
 
    // 3. The client deals with the wrapper
    SocketInterface socket = new SocketProxy( "127.0.0.1", 8189,
      args[0].equals("first") ? true : false );
 
    String  str = null;
    boolean skip = true;
    while (true) {
      if (args[0].equals("second")  &&  skip) {
        skip = ! skip;
      }
      else {
        str = socket.readLine();
        System.out.println( "Receive - " + str );  // java ProxyDemo first
        if (str.equals("quit")) break;             // Receive - 123 456
      }                                            // Send ---- 234 567
      System.out.print( "Send ---- " );            // Receive - 345 678
      str = Read.aString();                        //
      socket.writeLine( str );                     // java ProxyDemo second
      if (str.equals("quit")) break;               // Send ---- 123 456
    }                                              // Receive - 234 567
    socket.dispose();                              // Send ---- 345 678
  }
}
 
class SocketProxy implements SocketInterface {
  // 1. Create a "wrapper" for a remote,
  // or expensive, or sensitive target
  private Socket      socket;
  private BufferedReader in;
  private PrintWriter   out;
 
  public SocketProxy( String host, int port, boolean wait ) {
    try {
      if (wait) {
        // 2. Encapsulate the complexity/overhead of the target in the wrapper
        ServerSocket server = new ServerSocket( port );
        socket = server.accept();
      } else
        socket = new Socket( host, port );
        in  = new BufferedReader( new InputStreamReader(
                                        socket.getInputStream()));
        out = new PrintWriter( socket.getOutputStream(), true );
      } catch( IOException e ) {
        e.printStackTrace();
      }
  }
  public String readLine() {
    String str = null;
    try {
      str = in.readLine();
    } catch( IOException e ) {
      e.printStackTrace();
    }
    return str;
  }
  public void writeLine( String str ) {
    // 4. The wrapper delegates to the target
    out.println( str );
  }
  public void dispose() {
    try {
      socket.close();
    } catch( IOException e ) {
      e.printStackTrace();
    }
  }
    }


 

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