Welcome to My Blog 👋

Java, Spring Framework, Microservices, Docker, Kubernetes, AWS and Others 🚀
Follow Me

Design Pattern - Visitor



  May 01, 2019    Labels:,,,,,,,, 

Nesne yönelimli programlamanın temellerinden olan türetme her durumda doğru bir şekilde çalışmayabilir. Örneğin bir bankada müşteri tiplerini tanımladığımızı düşünürsek ortak özellikleri müşteri sınıfına koyarak müşteri türüne özel sınıfları bu müşteri sınıfından türetiriz. Bu durumda örneğin türeyen 10 sınıftan 9'unda olacak ama sadece 1'inde olmayacak özelliği üst sınıfa mı koymalıyız yoksa her bir taban sınıfa mı tanımlamalıyız problemi ortaya çıkacaktır. Bu iki seçenekte daha sonradan problem yaratacaktır. Üst sınıfa koymak bazı alt sınıflarda kullanılmayacak özelliğin o sınıflarda var olmasına neden olacaktır. Alt sınıfa koymak ise daha sonra değişiklik yapmayı zorlaştıracaktır. Bu probleme çözüm getiren kalıp Visitor Patern'ıdır. Bu patern ile bazı sınıflarda olacak özellikler o sınıflara dinamik olarak eklenir.

Uygulama
  • Client nesnesini müşteri nesnelerini kullanacak bir sınıf olarak düşünebiliriz.
  • Element arayüzü ise müşteri sınıfı olarak düşünülebilir. Bu arayüzü implement eden nesneler müşteri türlerini oluşturan nesnelerdir.
  • Visitor arayüzü ile client nesne kullanmak istediği ek özelliği dinamik olarak element sınıflarına ekleyebilir.



public abstract class Musteri {
    private int id;
    private String ad;
    //...
    public void accept(IVisitor visitor);
}

public class BireyselMusteri extends Musteri {
    public void accept(IVisitor visitor) {
        visitor.visit(this);
    }
}

public class TicariMusteri extends Musteri {
    public void accept(IVisitor visitor) {
        visitor.visit(this);
    }
}

public interface IVisitor {
    public void visit(Musteri musteri);
}

public class KonutKredisi implements IVisitor {
    public void visit (Musteri musteri) {
        if(musteri instanceof BireyselMusteri) {
            //kredi kullandırım işlemleri
        } else if (musteri instanceof TicariMusteri) {
            //kredi kullanılamaz hatası
        }
    }
}

public class Test {
    public static void main() {
        Musteri musteri1 = new BireyselMusteri();
        Musteri musteri2 = new TicariMusteri();
        KonutKredisi konutKredisi = new KonutKredisi();
        musteri1.visit(konutKredisi);
        musteri2.visit(konutKredisi);
    }
}

No comments:

Post a Comment