Ziyaretçi
Bu tasarım deseni, çok sayıda ve farklı tipteki nesneler üzerinde işlem yapabilmek amacıyla kullanılır. İşlem yapılacak nesnelerde herhangi bir değişiklik yapılmaz. İşlemi ziyaretçi nesneleri yapar. Eğer sisteme yeni nesneler eklenmiyor, fakat sık sık yeni işlemlerin eklenmesi gerekiyorsa bu tasarım deseni kullanılabilir. Bu tasarım deseninin kullanılmasıyla, yapılacak işlemle ilgili kodların merkezi bir nesnede toplanır.
Örnek :
Bu örnekte, bir şirkette çalışan Personel hiyerarşisi bulunmaktadır. Bu hiyerarşide, İşçi ve Yönetici alt sınıfları vardır. Bu sınıf hiyerarşisinde farklı işlemler yapabilmek için ziyaretçi tasarım deseni kullanılacaktır. Bu işlemler maaş hesaplama ve çalışma saatlerini düzenleme işlemleridir. Bunun için PersonelZiyaretçisi üst sınıfı yaratılır. Farklı tipteki maaş hesaplama ve çalışma saati hesaplama işlemleri için de MaaşHesaplamaZiyaretçisi ve ÇalışmaPlanıZiyaretçisi alt sınıfları yani ziyaretçi sınıfları oluşturulur. Bu ziyaretçi sınıfları işçi ve yönetici sınıfları üzerinde çeşitli işlemler yapabilirler. Sistemi deneyen Şirket istemci sınıfı da örnekte yer alır.
Örnek Sınıf Çizelgesi :
Örnek Java Kodu : ( Kodlar java 1.6.0.7 ile derlenip, çalıştırılmıştır. )
Personel.java :
public interface Personel {
void kabulEt( PersonelZiyaretçisi ziyaretçi );
}
İşçi.java :
public class İşçi implements Personel {
@Override
public void kabulEt( PersonelZiyaretçisi ziyaretçi ) {
ziyaretçi.ziyaretEt( this );
}
}
Yönetici.java :
public class Yönetici implements Personel {
@Override
public void kabulEt( PersonelZiyaretçisi ziyaretçi ) {
ziyaretçi.ziyaretEt( this );
}
}
PersonelZiyaretçisi.java :
public interface PersonelZiyaretçisi {
void ziyaretEt( İşçi işçi );
void ziyaretEt( Yönetici yönetici );
}
MaaşHesaplamaZiyaretçisi.java :
public class MaaşHesaplamaZiyaretçisi
implements PersonelZiyaretçisi {
@Override
public void ziyaretEt(İşçi işçi) {
System.out.println( "İşçi maaşı hesaplandı." );
}
@Override
public void ziyaretEt(Yönetici yönetici) {
System.out.println( "Yönetici maaşı hesaplandı." );
}
}
ÇalışmaPlanıZiyaretçisi.java :
public class ÇalışmaPlanıZiyaretçisi
implements PersonelZiyaretçisi {
@Override
public void ziyaretEt(İşçi işçi) {
System.out.println( "İşçi çalışma saatleri hesaplandı." );
}
@Override
public void ziyaretEt(Yönetici yönetici) {
System.out.println(
"Yönetici çalışma saatleri hesaplandı." );
}
}
Şirket.java :
public class Şirket {
public static void main(String[] args) {
// Personel nesnelerini oluştur.
İşçi işçi = new İşçi();
Yönetici yönetici = new Yönetici();
// Ziyaretçi nesnelerini oluştur.
PersonelZiyaretçisi ziyaretçi1 =
new MaaşHesaplamaZiyaretçisi();
PersonelZiyaretçisi ziyaretçi2 =
new ÇalışmaPlanıZiyaretçisi();
// Maaş Hesaplama işlemlerini yap.
ziyaretçi1.ziyaretEt( işçi );
ziyaretçi1.ziyaretEt( yönetici );
// Çalışma Planı işlemlerini yap.
ziyaretçi2.ziyaretEt( işçi );
ziyaretçi2.ziyaretEt( yönetici );
}
}