Proxy Design Pattern
Proxy Design Pattern
Yazılım dünyasına yeni adım attıysanız, muhtemelen “Tekerleği yeniden icat etmeyin, tasarım desenlerini öğrenin!” sözünü duymuşsunuzdur. Bugün, bu desenler arasında en yetenekli ve “korumacı” olanlardan birini mercek altına alıyoruz: Proxy (Vekil) Deseni.
Nedir Bu Proxy?
En basit haliyle Proxy; bir nesneye erişmek istediğinizde araya giren, o nesneyi temsil eden bir “aracı” katmandır. Bir nesneye doğrudan gitmek yerine, onun vekiliyle konuşursunuz. Vekil ise arka planda güvenlikten loglamaya, performanstan erişim kontrolüne kadar birçok işi sizin yerinize halleder.
Analoji: CEO ve Asistanı Bir şirketin CEO’suyla (Gerçek Nesne) görüşmek istediğinizi hayal edin. Kapıyı çalıp içeri giremezsiniz. Önce Asistan (Proxy) ile görüşürsünüz. Asistan;
- Kim olduğunuzu sorar (Güvenlik/Erişim Kontrolü),
- CEO’nun meşguliyetine göre sizi bekletir (Yönetim),
- Belki de sorunuzu CEO’ya gitmeden kendisi cevaplar (Caching/Önbellek). Siz CEO ile iletişim kurduğunuzu sanırsınız ama trafiği asistan yönetir.
🏗️ Proxy Deseninin 3 Ana Kahramanı
Bu desen genellikle üç temel yapı taşı üzerine kurulur:
- Subject (Arayüz): Hem gerçek nesnenin hem de vekilin uyguladığı ortak “yetenekler” listesidir. İstemci (Client) sadece bu arayüzü bilir.
- Real Subject (Gerçek Nesne): Asıl işi yapan, asıl yükü taşıyan nesne.
- Proxy (Vekil): Gerçek nesneye referans tutan ve araya giren sınıf.
Neden Kullanırız? (4 Farklı Senaryo)
Yeni başlayanlar için Proxy’nin nerede karşımıza çıkacağını bilmek kritiktir:
3. Kullanım Senaryoları (Neden Kullanırız?)
Kod Başındaki Proxy: Java Örneği
Gelin, veritabanından ağır bir rapor çekme senaryosunu kodlayalım.
Get Muratguven’s stories in your inbox
Join Medium for free to get updates from this writer.
1. Ortak Arayüz (Subject)
public interface ReportService {
void generateReport();
}2. Asıl İşlem (Real Subject)
public class RealReportService implements ReportService {
@Override
public void generateReport() {
System.out.println("Veritabanından ağır rapor çekiliyor... (Bu işlem 2 saniye sürer)");
}
}3. Akıllı Aracı (Proxy)
public class ReportProxy implements ReportService {
private RealReportService realService;
private String userRole;
public ReportProxy(String userRole) {
this.userRole = userRole;
}
@Override
public void generateReport() {
if (!"ADMIN".equals(userRole)) {
System.out.println("HATA: Bu raporu sadece adminler görebilir!");
return;
}
if (realService == null) {
realService = new RealReportService();
}
System.out.println("LOG: Rapor isteği sisteme kaydedildi.");
realService.generateReport();
}
}Spring Boot Dünyasında Proxy Sihri
Eğer Java/Spring geliştiricisiyseniz, aslında farkında olmadan her gün Proxy kullanıyorsunuz!
- @Transactional: Spring, bu anotasyonu gördüğünde sınıfınızın bir Proxy’sini oluşturur. Siz metodu çağırdığınızda Proxy önce veritabanı bağlantısını açar, işleminiz bitince kapatır.
- @Cacheable: Metodunuzun sonucunu saklar. Eğer aynı parametrelerle tekrar gelirseniz, Proxy gerçek metodu hiç çalıştırmadan sonucu size “fırlatır”.
Dikkat: Bir sınıfın içindeki bir metodun, aynı sınıftaki başka bir metodu çağırması durumunda (Self-invocation) Proxy devreye giremez. Bu, mülakatlarda sıkça sorulan bir “tuzağı”dır!
Avantajlar ve Dezavantajlar
Her tasarım deseninde olduğu gibi burada da bir denge (trade-off) vardır:
- Artıları: Gerçek nesneye dokunmadan ona yeni özellikler (log, güvenlik) ekleyebilirsiniz. Bu, kodun “Değişime kapalı, gelişime açık” olmasını sağlar.
- Eksileri: Sistemdeki sınıf sayısı artar. Çok küçük de olsa aradaki vekil katmanı nedeniyle bir gecikme yaşanabilir.
Bu son kısmı kaynağımda gördüğüm için koymak istedim
Son Söz: Proxy mi, Decorator mı?
İkisi de birbirine çok benzer. Ancak küçük bir farkla: Decorator nesneye yeni sorumluluklar eklemek için kullanılırken; Proxy nesneye olan erişimi kontrol etmek ve yönetmek için kullanılır.
Proxy deseni, kodunuzu daha güvenli ve performanslı hale getiren sadık bir asistandır. Onu doğru kullanmak, profesyonel bir yazılım mimarisine giden yolda en büyük yardımcınız olacaktır.





