Proxy Pattern, yazılım tasarımında oldukça yaygın kullanılan bir yapısal desendir. Bu desen, bir nesneye erişimi kontrol etmek veya ek fonksiyonlar eklemek için kullanılır. Ayrıca, Proxy Tasarım Deseni, genellikle gerçek nesneye erişimi kontrol etmek, önbellekleme yapmak, yetkilendirme sağlamak veya maliyetli işlemleri geciktirmek için de kullanılmaktadır. Şimdi bu tasarım desenini ve nasıl çalıştığını detaylı bir örnekle inceleyelim.
İçerik
Proxy Pattern’in Temel Yapısı
Bu tasarım deseni üç ana bileşenden oluşur:
- Subject (Konu): Proxy ve Gerçek Nesnenin (RealSubject) ortak arayüzünü tanımlar.
- RealSubject (Gerçek Nesne): Asıl işlevi gerçekleştiren sınıftır.
- Proxy (Vekil): Gerçek nesneye erişimi kontrol eder veya ek işlevsellik sağlar.
Proxy Pattern Kullanım Amacı
Bu deseni, aşağıdaki durumlarda kullanabiliriz:
- Gecikmeli Başlatma (Lazy Initialization): Gerçek nesneye ihtiyaç duyulana kadar oluşturulmasını geciktirir.
- Erişim Kontrolü: Belirli kullanıcıların belirli işlemleri gerçekleştirmesini engeller.
- Önbellekleme: Sonuçları önbelleğe alarak performansı artırır.
- Giriş/Çıkış Yönetimi: Ağ bağlantısı gibi kaynaklara erişimi yönetir.
Proxy Pattern Kod Örneği
Aşağıda, bir dosya okuma işlemini kontrol eden basit bir Proxy Tasarım deseni örneği yer almaktadır. Bu örnekte, FileReader
sınıfı gerçek nesne, FileReaderProxy
sınıfı ise vekil nesne olarak görev yapmaktadır.
// Subject Arayüzü
public interface Reader {
void read();
}
// Gerçek Nesne
public class FileReader implements Reader {
private String fileName;
public FileReader(String fileName) {
this.fileName = fileName;
loadFromDisk();
}
private void loadFromDisk() {
System.out.println("Loading " + fileName);
}
@Override
public void read() {
System.out.println("Reading " + fileName);
}
}
// Proxy Nesne
public class FileReaderProxy implements Reader {
private FileReader fileReader;
private String fileName;
public FileReaderProxy(String fileName) {
this.fileName = fileName;
}
@Override
public void read() {
if (fileReader == null) {
fileReader = new FileReader(fileName);
}
fileReader.read();
}
}
// Kullanım
public class ProxyPatternDemo {
public static void main(String[] args) {
Reader reader = new FileReaderProxy("test.txt");
// Dosya ilk kez okunduğunda, dosya yüklenir ve okunur
reader.read();
// Dosya tekrar okunduğunda, doğrudan okunur
reader.read();
}
}
Proxy Pattern – Kod Açıklaması
- Subject Arayüzü:
Reader
arayüzü, hemFileReader
hem deFileReaderProxy
tarafından uygulanır. Bu arayüz, okuma işlemini tanımlar. - Gerçek Nesne:
FileReader
sınıfı, dosyanın yüklenmesi ve okunması işlemlerini gerçekleştiren sınıftır. Dosya adı ile başlatılır veread
yöntemi çağrıldığında dosyayı okur. - Proxy Nesne:
FileReaderProxy
sınıfı, gerçek nesneye erişimi kontrol eder. İlk kezread
yöntemi çağrıldığında gerçek nesneyi oluşturur ve ardından okuma işlemini gerçekleştirir.
Sonuç
Proxy Pattern, yazılım geliştirme sürecinde nesnelere erişimi kontrol etmenin etkili bir yoludur. Sistemdeki gereksiz kaynak tüketimi ve güvenlik açıklarını bu desen sayesinde önleyebiliriz. Proxy Pattern, gücü, esnekliği ve geniş kullanım alanı sayesinde yazılım mühendisleri için vazgeçilmez bir araçtır. Bu desen, çeşitli senaryolarda uygulanarak yazılım projelerinin daha etkin ve verimli olmasını sağlar.