Bazı yazılım projelerinde bir nesneye yeni bir davranış eklemek istediğinizde kendinizi “Bu sınıfa doğrudan müdahale etmem gerek ama istemiyorum” derken buluyor musunuz? İşte tam bu noktada Visitor Pattern (Ziyaretçi Tasarım Kalıbı) devreye giriyor! 🎯
🤔 Visitor Pattern Nedir?
Visitor Pattern, mevcut sınıfları değiştirmeden onlara yeni işlemler eklemeyi mümkün kılan bir davranışsal tasarım desenidir.
Bu desen, ziyaret edilecek nesneleri ve bu nesnelere uygulanacak işlemleri birbirinden ayırır, böylece yeni davranışlar eklemek için mevcut kodu değiştirmek zorunda kalmazsınız.
—
🚀 Visitor Pattern Kullanım Alanları
- Dosya sistemleri: Klasör ve dosya yapıları üzerinde işlemler yapmak (örn. boyut hesaplama, erişim izni kontrolü)
- AST (Soyut Sözdizimi Ağaçları): Programlama dillerinde kod analizi yapmak
- Ödeme sistemleri: Farklı ödeme türleri için özel işlemler uygulamak (kredi kartı, PayPal vb.)
- Grafik nesneleri: Bir çizim nesnesine farklı render işlemleri eklemek
—
🛠 Visitor Pattern Kod Örneği
Diyelim ki elimizde bir şekil koleksiyonu var ve bunlara alan hesaplama ve çizim gibi işlemler eklemek istiyoruz. Ancak mevcut sınıflara dokunmadan!
1️⃣ Element (Ziyaret Edilen) Arayüzü
interface Shape {
void accept(Visitor visitor);
}
2️⃣ Concrete Element (Gerçek Şekiller)
class Circle implements Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
public double getRadius() {
return radius;
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
class Rectangle implements Shape {
private double width, height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
public double getWidth() {
return width;
}
public double getHeight() {
return height;
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
3️⃣ Visitor (Ziyaretçi) Arayüzü
interface Visitor {
void visit(Circle circle);
void visit(Rectangle rectangle);
}
4️⃣ Concrete Visitor (Farklı Davranışları Ekleyen Sınıflar)
class AreaCalculator implements Visitor {
@Override
public void visit(Circle circle) {
double area = Math.PI * Math.pow(circle.getRadius(), 2);
System.out.println("Dairenin Alanı: " + area);
}
@Override
public void visit(Rectangle rectangle) {
double area = rectangle.getWidth() * rectangle.getHeight();
System.out.println("Dikdörtgenin Alanı: " + area);
}
}
5️⃣ Kullanım
public class Main {
public static void main(String[] args) {
Shape circle = new Circle(5);
Shape rectangle = new Rectangle(4, 6);
Visitor areaCalculator = new AreaCalculator();
circle.accept(areaCalculator);
rectangle.accept(areaCalculator);
}
}
📌 Çıktı:
Dairenin Alanı: 78.53981633974483
Dikdörtgenin Alanı: 24.0
—
🎯 Visitor Pattern Kullanmasaydık Ne Olurdu?
- Her yeni işlem eklediğimizde şekil sınıflarını değiştirmek zorunda kalırdık.
- Kod tekrarına ve yüksek bağımlılığa neden olurduk.
- Sınıflar genişledikçe kod karmaşıklığı artardı.
Visitor Pattern sayesinde, mevcut sınıflara dokunmadan yeni işlevler ekleyebilir ve sistemi genişletilebilir hale getirebiliriz! 🏗
—
🔥 Sonuç: Ziyaretçilerle Esneklik Kazanın!
Visitor Pattern, mevcut nesnelere zarar vermeden yeni işlemler eklemeyi sağlayan güçlü bir tekniktir. Eğer sürekli yeni işlevler eklemeniz gerekiyorsa ve kod değişikliklerini en aza indirmek istiyorsanız, Visitor Pattern harika bir çözümdür! 🚀