22 Ocak 2017 Pazar

GoF - Proxy Örüntüsü

Proxy - Yapısal Örüntü
Proxy bir yapısal örüntüdür. Amacı gerçek nesneye erişimi saklamak/engellemek/kontrol etmek.

Java
Proxy Sınıfı bu örüntüyü gerçekleştiriyor sayılabilir.

Bileşenleri
Açıklaması şöyle
Proxy Design Pattern uses three components to implement:
- Subject - the interface which exposes the functionality.
- Real Subject - the class implements the Subject and provides the concrete implementation of the interface. In this class, we hide behind the Proxy.
- Proxy - the class implements the Subject so that it can substitute Real Subject objects. It maintains the reference of the Real Subject to the substituted Proxy object so that it can forward a request to the Real Subject whenever needed.
Bazı Proxy Türleri
Açıklaması şöyle
We can do proxy in many ways like:
- Virtual Proxy - Do lazy loading of memory rich or heavy objects until it is needed.
- Decorative Proxy - Add extra functionality to the existing objects just like we do in Decorator Design Pattern. 
- Protective Proxy - Control access to the objects functionality.
- Debugging Proxy - Add logs that may also be helpful in debugging.
- Remote Proxy - provides a local representative for a remote object like stub objects in RMI/RPC or CORBA.
- Smart Proxy - checking the lock on real object while updating, loading persistence object upon the first reference, managing real object reference, etc.
Proxy ve Decorator Örüntüleri
Proxy ve Decorator birbirlerine çok benziyorlar. Ancak Decorator nesneye yeni davranış ekler. Proxy ise gerçek nesneye erişimi kontrol eder. Decorator ve Proxy arasındaki önemli bir farkın açıklaması şöyle
The difference between Proxy and Decorator according to the GoF is that Proxy restricts the client. Decorator does not. Proxy may restrict what a client does by controlling access to functionality; or it may restrict what a client knows by performing actions that are invisible and unknown to the client. Decorator does the opposite: it enhances what its delegate does in a way that is visible to clients.

Virtual Proxy
Bence Proxy örüntüsünün en önemli faydası yaratması pahalı olan nesnelerin son ana kadar yaratılmasını engellemek yani lazy davranmak

Protective Proxy
Gerçek nesneye erişimi güvenlik sebebiyle engeller, araya girer.

Kullanım
Örnek - Virtual Proxy
Şöyle yaparız. Bu kodun niçin Proxy olduğunun açıklaması şöyle
A Decorator is always passed its delegatee. A Proxy might create it himself, or he might have it injected.
Burada ProxyImage logic içeriyor ve kendisine verilen parametreye bakarak doğru sınıfı yani diskten yüklenen RealImage veya uzaktan yüklenen RemoteImage sınıfını lazy olarak yaratıyor.
public interface Image {
  ...
}

public class RealImage implements Image {
 ...
}

public class RemoteImage implements Image {
 ...
}

public class ProxyImage implements Image {
  private Image image;  
  protected String remoteHost;
  protected String fileNameWithPath;

  public void load() {
    if (remoteHost != null) {
      image = new RemoteImage(remoteHost, fileNameWithPath);
    } else {
      image = new RealImage(fileNameWithPath);
    }
  }
  ...
}
Örnek - Decorative Proxy
Şöyle yaparız.
public class Subject
{
  public virtual void Foo ()
  {
    ...
  }
}

public class SubjectProxy : Subject
{
  public override void Foo()
  {
    ...
  }
}
Şöyle kullanırız.
public Subject GetSubject()
{
    return new SubjectProxy();
}

Subject subject = GetSubject();
subject.Foo(); // would use the proxied method

Hiç yorum yok:

Yorum Gönder