Visitor kalıbına hangi durumda ihtiyaç duyabiliriz? Bir nesne yapısı üzerinde işlemler yapmak istiyoruz ve bu işlemlerin üzerinde çalıştığı nesne yapısından bağımsız olarak çeşitlenmesini istiyoruz. Bu durumda Visitor kalıbı işimize yarayabilir. Aşağıdaki örnekte bir arabanın parçaları üzerinde clean ve repair işlemleri yapılıyor:
public interface CarElement {
void accept(CarElementVisitor visitor);
}
public interface CarElementVisitor {
void visit(Engine engine);
void visit(Wheel wheel);
}
public class Car implements CarElement {
private Engine engine;
private List wheels;
public Car(Engine engine, Wheel... wheels) {
this.engine = engine;
this.wheels = Arrays.asList(wheels);
}
@Override
public void accept(CarElementVisitor visitor) {
engine.accept(visitor);
for (Wheel wheel : wheels) {
wheel.accept(visitor);
}
}
}
public class Engine implements CarElement {
@Override
public void accept(CarElementVisitor visitor) {
visitor.visit(this);
}
}
public class Wheel implements CarElement {
@Override
public void accept(CarElementVisitor visitor) {
visitor.visit(this);
}
}
public class CleaningVisitor implements CarElementVisitor {
@Override
public void visit(Engine engine) {
System.out.println("Cleaning engine!");
}
@Override
public void visit(Wheel wheel) {
System.out.println("Cleaning wheel!");
}
}
public class RepairingVisitor implements CarElementVisitor {
@Override
public void visit(Engine engine) {
System.out.println("Repairing engine!");
}
@Override
public void visit(Wheel wheel) {
System.out.println("Repairing wheel!");
}
@Override
public void visit(Car car) {
System.out.println("Repairing car!");
}
}
public class Program {
public static void main(String[] args) {
Engine engine = new Engine();
Wheel wheel1 = new Wheel();
Wheel wheel2 = new Wheel();
Car car = new Car(engine, wheel1, wheel2);
CarElementVisitor cleaningVisitor = new CleaningVisitor();
CarElementVisitor repairingVisitor = new RepairingVisitor();
car.accept(cleaningVisitor);
car.accept(repairingVisitor);
}
}
Burada Car sınıfına baktığımızda, üzerindeki "visit" işleminden haberdar fakat Cleaning ve Repairing gibi ayrıntılardan habersiz. Yani, kendi nesne yapısı üzerinde işlemlerin yapılabilmesini sağlıyor ve hatta hangi parçaları üzerinde işlemlerin yapılacağını belirliyor. Fakat işlemlerin somut sınıflarına bağımlı değil. Sadece CarElementVisitor arayüzüne bağımlı.
Visitor sınıfları ise, Car sınıfının parçaları üzerinde yapılacak işlemin ayrıntılarını biliyor.
Comments