{"id":39392,"date":"2026-02-20T13:40:48","date_gmt":"2026-02-20T10:40:48","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=39392"},"modified":"2026-02-20T13:40:48","modified_gmt":"2026-02-20T10:40:48","slug":"visitor-tasarim-deseni-javada","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/visitor-tasarim-deseni-javada\/","title":{"rendered":"Visitor Tasar\u0131m Deseni Java&#8217;da"},"content":{"rendered":"<p><body><\/p>\n<h2>Visitor Tasar\u0131m Deseni Java&#8217;da<\/h2>\n<p>Yaz\u0131l\u0131m geli\u015ftirmede, kodun esnekli\u011fini, bak\u0131m\u0131n\u0131 ve geni\u015fletilebilirli\u011fini art\u0131rmak amac\u0131yla \u00e7e\u015fitli tasar\u0131m desenleri kullan\u0131l\u0131r. Bu desenler, belirli bir problemi \u00e7\u00f6zmek i\u00e7in kan\u0131tlanm\u0131\u015f, tekrar kullan\u0131labilir \u00e7\u00f6z\u00fcmler sunar. Davran\u0131\u015fsal tasar\u0131m desenlerinden biri olan Visitor (Ziyaret\u00e7i) tasar\u0131m deseni, bir nesne yap\u0131s\u0131 \u00fczerinde yeni operasyonlar tan\u0131mlaman\u0131n, bu nesnelerin s\u0131n\u0131flar\u0131n\u0131 de\u011fi\u015ftirmeden m\u00fcmk\u00fcn k\u0131lan g\u00fc\u00e7l\u00fc bir mekanizmad\u0131r. \u00d6zellikle karma\u015f\u0131k nesne hiyerar\u015fileri veya a\u011fa\u00e7 yap\u0131lar\u0131 \u00fczerinde farkl\u0131 t\u00fcrde i\u015flemler ger\u00e7ekle\u015ftirilmesi gerekti\u011finde, Visitor deseni \u00f6nemli avantajlar sunar. Bu makalede, Visitor tasar\u0131m deseninin ne oldu\u011fu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131, Java&#8217;da nas\u0131l uyguland\u0131\u011f\u0131, avantajlar\u0131, dezavantajlar\u0131 ve ne zaman kullan\u0131lmas\u0131 gerekti\u011fi detayl\u0131 bir \u015fekilde incelenecektir.<\/p>\n<h3>Giri\u015f: Visitor Deseni Nedir?<\/h3>\n<p>Visitor tasar\u0131m deseni, &#8220;bir nesne yap\u0131s\u0131n\u0131n elemanlar\u0131 \u00fczerinde ger\u00e7ekle\u015ftirilecek bir operasyonu, elemanlar\u0131n s\u0131n\u0131flar\u0131n\u0131 de\u011fi\u015ftirmeden temsil eden&#8221; bir davran\u0131\u015fsal tasar\u0131m desenidir. Ba\u015fka bir deyi\u015fle, bir nesne hiyerar\u015fisindeki farkl\u0131 t\u00fcrdeki nesneler \u00fczerinde \u00e7e\u015fitli i\u015flemler yapmak istedi\u011finizde, bu i\u015flemleri nesnelerin kendi s\u0131n\u0131flar\u0131na eklemek yerine, ayr\u0131 bir &#8220;ziyaret\u00e7i&#8221; s\u0131n\u0131f\u0131na ta\u015f\u0131man\u0131z\u0131 sa\u011flar. Bu yakla\u015f\u0131m, nesne yap\u0131s\u0131n\u0131n &#8220;a\u00e7\u0131k\/kapal\u0131 prensibine&#8221; (Open\/Closed Principle) uygun kalmas\u0131na yard\u0131mc\u0131 olur; yani, mevcut kodun de\u011fi\u015ftirilmeden yeni i\u015flevsellik eklenmesine olanak tan\u0131r.<\/p>\n<p>Bu desen, \u00f6zellikle derleyiciler, yorumlay\u0131c\u0131lar veya grafik edit\u00f6rleri gibi uygulamalarda, soyut s\u00f6zdizimi a\u011fa\u00e7lar\u0131 (Abstract Syntax Trees &#8211; AST) veya di\u011fer karma\u015f\u0131k nesne yap\u0131lar\u0131 \u00fczerinde birden fazla, ba\u011f\u0131ms\u0131z i\u015flem (\u00f6rne\u011fin, tip kontrol\u00fc, kod \u00fcretimi, optimizasyon) yap\u0131lmas\u0131 gerekti\u011finde \u00e7ok kullan\u0131\u015fl\u0131d\u0131r. Visitor deseni sayesinde, her yeni i\u015flem, mevcut nesne s\u0131n\u0131flar\u0131n\u0131 de\u011fi\u015ftirmeden, yeni bir ziyaret\u00e7i s\u0131n\u0131f\u0131 olarak eklenebilir.<\/p>\n<h3>Tasar\u0131m Deseni Kategorisi ve Amac\u0131<\/h3>\n<p>Visitor deseni, GoF (Gang of Four) taraf\u0131ndan tan\u0131mlanan 23 tasar\u0131m deseninden biri olup, <strong>davran\u0131\u015fsal (behavioral) desenler<\/strong> kategorisine girer. Davran\u0131\u015fsal desenler, nesneler ve s\u0131n\u0131flar aras\u0131ndaki etkile\u015fimleri ve sorumluluklar\u0131n da\u011f\u0131t\u0131m\u0131n\u0131 ele al\u0131r. Visitor deseninin temel amac\u0131, bir nesne yap\u0131s\u0131 \u00fczerindeki bir algoritmay\u0131 (i\u015flemi) bu yap\u0131n\u0131n elemanlar\u0131ndan ay\u0131rmakt\u0131r.<\/p>\n<p>Bu ayr\u0131m, a\u015fa\u011f\u0131daki ana hedeflere ula\u015fmay\u0131 sa\u011flar:<\/p>\n<p>1.  <strong>Geni\u015fletilebilirlik:<\/strong> Nesne yap\u0131s\u0131n\u0131 de\u011fi\u015ftirmeden yeni i\u015flemler (algoritmalar) eklemeyi kolayla\u015ft\u0131r\u0131r. Her yeni i\u015flem, yeni bir <code>Visitor<\/code> s\u0131n\u0131f\u0131 olarak temsil edilir.<br \/>\n2.  <strong>Bak\u0131m Kolayl\u0131\u011f\u0131:<\/strong> \u0130lgili t\u00fcm operasyonlar\u0131 tek bir <code>Visitor<\/code> s\u0131n\u0131f\u0131nda gruplayarak kodun daha d\u00fczenli ve bak\u0131m\u0131 daha kolay olmas\u0131n\u0131 sa\u011flar.<br \/>\n3.  <strong>Kaps\u00fclleme:<\/strong> Nesne yap\u0131s\u0131n\u0131n elemanlar\u0131, kendi i\u00e7 mant\u0131klar\u0131n\u0131 korurken, operasyonlar\u0131 d\u0131\u015far\u0131ya delege edebilirler.<br \/>\n4.  <strong>Tip G\u00fcvenli\u011fi:<\/strong> Derleme zaman\u0131 tip kontrol\u00fc sayesinde hatalar\u0131n erken a\u015famada tespit edilmesine yard\u0131mc\u0131 olur.<\/p>\n<h3>Problem ve Motivasyon<\/h3>\n<p>Visitor deseninin neden gerekli oldu\u011funu daha iyi anlamak i\u00e7in somut bir problem senaryosu d\u00fc\u015f\u00fcnelim. Bir grafik edit\u00f6r\u00fc uygulamas\u0131nda farkl\u0131 \u015fekil t\u00fcrleri oldu\u011funu varsayal\u0131m: <code>Circle<\/code> (\u00c7ember), <code>Rectangle<\/code> (Dikd\u00f6rtgen) ve <code>Triangle<\/code> (\u00dc\u00e7gen). Bu \u015fekillerin hepsi ortak bir <code>Shape<\/code> (\u015eekil) aray\u00fcz\u00fcn\u00fc uygular.<\/p>\n<p>\u015eimdi bu \u015fekiller \u00fczerinde \u00e7e\u015fitli i\u015flemler yapmak istedi\u011fimizi d\u00fc\u015f\u00fcnelim:<\/p>\n<p>*   Her \u015feklin alan\u0131n\u0131 hesaplamak.<br \/>\n*   Her \u015fekli ekrana \u00e7izmek.<br \/>\n*   Her \u015feklin XML format\u0131nda d\u0131\u015fa aktar\u0131m\u0131n\u0131 yapmak.<br \/>\n*   Her \u015feklin JSON format\u0131nda d\u0131\u015fa aktar\u0131m\u0131n\u0131 yapmak.<\/p>\n<p><strong>Geleneksel Yakla\u015f\u0131m (Visitor Deseni Olmadan):<\/strong><\/p>\n<p>Geleneksel bir yakla\u015f\u0131mda, bu operasyonlar\u0131n her birini <code>Shape<\/code> aray\u00fcz\u00fcne ve dolay\u0131s\u0131yla <code>Circle<\/code>, <code>Rectangle<\/code>, <code>Triangle<\/code> s\u0131n\u0131flar\u0131na birer metot olarak eklememiz gerekirdi:<\/p>\n<pre><code class=\"language-java\">interface Shape {\n    double calculateArea();\n    void draw();\n    String toXml();\n    String toJson(); \/\/ Yeni bir i\u015flem eklendi\u011finde\n}\n\nclass Circle implements Shape {\n    \/\/ ... alan ve \u00e7izim metotlar\u0131\n    @Override\n    public double calculateArea() { \/<em> \u00c7ember alan\u0131 hesaplama <\/em>\/ return 0; }\n    @Override\n    public void draw() { \/<em> \u00c7ember \u00e7izme <\/em>\/ }\n    @Override\n    public String toXml() { \/<em> \u00c7emberi XML'e d\u00f6n\u00fc\u015ft\u00fcrme <\/em>\/ return \"\"; }\n    @Override\n    public String toJson() { \/<em> \u00c7emberi JSON'a d\u00f6n\u00fc\u015ft\u00fcrme <\/em>\/ return \"\"; }\n}\n\nclass Rectangle implements Shape {\n    \/\/ ... alan ve \u00e7izim metotlar\u0131\n    @Override\n    public double calculateArea() { \/<em> Dikd\u00f6rtgen alan\u0131 hesaplama <\/em>\/ return 0; }\n    @Override\n    public void draw() { \/<em> Dikd\u00f6rtgen \u00e7izme <\/em>\/ }\n    @Override\n    public String toXml() { \/<em> Dikd\u00f6rtgeni XML'e d\u00f6n\u00fc\u015ft\u00fcrme <\/em>\/ return \"\"; }\n    @Override\n    public String toJson() { \/<em> Dikd\u00f6rtgeni JSON'a d\u00f6n\u00fc\u015ft\u00fcrme <\/em>\/ return \"\"; }\n}\n\/\/ Ve benzer \u015fekilde Triangle i\u00e7in<\/code><\/pre>\n<p>Bu yakla\u015f\u0131m\u0131n ciddi dezavantajlar\u0131 vard\u0131r:<\/p>\n<p>1.  <strong>A\u00e7\u0131k\/Kapal\u0131 Prensibi \u0130hlali:<\/strong> Her yeni i\u015flem ekledi\u011fimizde (\u00f6rne\u011fin, <code>toJson()<\/code>), <code>Shape<\/code> aray\u00fcz\u00fcn\u00fc ve onu uygulayan <em>t\u00fcm somut \u015fekil s\u0131n\u0131flar\u0131n\u0131<\/em> de\u011fi\u015ftirmek zorunda kal\u0131r\u0131z. Bu, mevcut, test edilmi\u015f kodun de\u011fi\u015ftirilmesi anlam\u0131na gelir ve hata riskini art\u0131r\u0131r.<br \/>\n2.  <strong>Sorumluluklar\u0131n Kar\u0131\u015fmas\u0131:<\/strong> <code>Shape<\/code> s\u0131n\u0131flar\u0131, kendi temel sorumluluklar\u0131 olan &#8220;\u015fekil olmak&#8221; d\u0131\u015f\u0131nda, alan hesaplama, \u00e7izim, XML&#8217;e d\u00f6n\u00fc\u015ft\u00fcrme gibi bir\u00e7ok farkl\u0131 i\u015flemi de \u00fcstlenmek zorunda kal\u0131r. Bu, s\u0131n\u0131flar\u0131n tek sorumluluk prensibini (Single Responsibility Principle) ihlal etmesine neden olabilir.<br \/>\n3.  <strong>Kod Tekrar\u0131 ve Da\u011f\u0131n\u0131kl\u0131k:<\/strong> Ayn\u0131 i\u015flem mant\u0131\u011f\u0131 (\u00f6rne\u011fin, XML&#8217;e d\u00f6n\u00fc\u015ft\u00fcrme), farkl\u0131 \u015fekil s\u0131n\u0131flar\u0131nda benzer \u015fekillerde uygulanmak zorunda kalabilir veya her s\u0131n\u0131f\u0131n i\u00e7inde da\u011f\u0131n\u0131k bir \u015fekilde bulunabilir.<\/p>\n<p>\u0130\u015fte bu noktada Visitor deseni devreye girer. Visitor deseni, bu operasyonlar\u0131 nesne yap\u0131s\u0131n\u0131n d\u0131\u015f\u0131na, ayr\u0131 bir &#8220;ziyaret\u00e7i&#8221; s\u0131n\u0131f\u0131na ta\u015f\u0131yarak bu sorunlar\u0131 \u00e7\u00f6zer. B\u00f6ylece, yeni bir i\u015flem eklemek istedi\u011fimizde, mevcut <code>Shape<\/code> s\u0131n\u0131flar\u0131n\u0131 de\u011fi\u015ftirmek yerine sadece yeni bir <code>Visitor<\/code> s\u0131n\u0131f\u0131 olu\u015ftururuz.<\/p>\n<h3>Visitor Deseni Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h3>\n<p>Visitor deseni, d\u00f6rt ana bile\u015fenden olu\u015fur:<\/p>\n<p>1.  <strong>Visitor Aray\u00fcz\u00fc (Visitor Interface):<\/strong> Bu aray\u00fcz, nesne yap\u0131s\u0131ndaki her bir somut eleman t\u00fcr\u00fc i\u00e7in bir <code>visit()<\/code> metodu tan\u0131mlar. Her <code>visit()<\/code> metodu, ilgili somut eleman t\u00fcr\u00fcn\u00fc parametre olarak al\u0131r.<br \/>\n2.  <strong>Somut Visitor S\u0131n\u0131flar\u0131 (Concrete Visitor Classes):<\/strong> <code>Visitor<\/code> aray\u00fcz\u00fcn\u00fc uygulayan s\u0131n\u0131flard\u0131r. Her bir somut ziyaret\u00e7i, nesne yap\u0131s\u0131 \u00fczerinde ger\u00e7ekle\u015ftirilecek belirli bir operasyonu temsil eder ve <code>visit()<\/code> metotlar\u0131n\u0131 uygulayarak her eleman t\u00fcr\u00fc i\u00e7in \u00f6zel davran\u0131\u015flar sa\u011flar.<br \/>\n3.  <strong>Element Aray\u00fcz\u00fc (Element Interface):<\/strong> Bu aray\u00fcz, bir <code>accept(Visitor visitor)<\/code> metodu tan\u0131mlar. Bu metot, bir ziyaret\u00e7iyi parametre olarak al\u0131r ve ziyaret\u00e7inin kendisi i\u00e7in uygun <code>visit()<\/code> metodunu \u00e7a\u011f\u0131rmaktan sorumludur.<br \/>\n4.  <strong>Somut Element S\u0131n\u0131flar\u0131 (Concrete Element Classes):<\/strong> <code>Element<\/code> aray\u00fcz\u00fcn\u00fc uygulayan s\u0131n\u0131flard\u0131r. <code>accept()<\/code> metodunu kendi t\u00fcr\u00fcne \u00f6zg\u00fc <code>visit()<\/code> metodunu \u00e7a\u011f\u0131rarak uygularlar.<\/p>\n<p>#### \u00c7ift Da\u011f\u0131t\u0131m (Double Dispatch)<\/p>\n<p>Visitor deseninin kalbinde &#8220;\u00e7ift da\u011f\u0131t\u0131m&#8221; (double dispatch) mekanizmas\u0131 yatar. Normal metot \u00e7a\u011fr\u0131lar\u0131nda (tek da\u011f\u0131t\u0131m), \u00e7a\u011fr\u0131lacak metot, yaln\u0131zca al\u0131c\u0131 nesnenin (objenin) t\u00fcr\u00fcne g\u00f6re derleme zaman\u0131nda veya \u00e7al\u0131\u015fma zaman\u0131nda belirlenir. Ancak Visitor deseninde, \u00e7a\u011fr\u0131lacak <code>visit()<\/code> metodu hem <code>Element<\/code>&#8216;in (ziyaret edilen nesnenin) t\u00fcr\u00fcne hem de <code>Visitor<\/code>&#8216;\u0131n (ziyaret\u00e7inin) t\u00fcr\u00fcne g\u00f6re belirlenir.<\/p>\n<p>Bu s\u00fcre\u00e7 \u015fu \u015fekilde i\u015fler:<\/p>\n<p>1.  Client kodu, bir <code>Element<\/code> nesnesi \u00fczerinde bir i\u015flem yapmak istedi\u011finde, <code>element.accept(concreteVisitor)<\/code> metodunu \u00e7a\u011f\u0131r\u0131r.<br \/>\n2.  <code>accept()<\/code> metodu, \u00e7a\u011f\u0131ran <code>Element<\/code> nesnesinin somut t\u00fcr\u00fcn\u00fc bilir (\u00f6rne\u011fin, <code>Circle<\/code> s\u0131n\u0131f\u0131 i\u00e7indeki <code>accept()<\/code> metodu <code>this<\/code> anahtar kelimesi ile kendi referans\u0131n\u0131 ge\u00e7irir).<br \/>\n3.  <code>accept()<\/code> metodu, kendisine parametre olarak gelen <code>visitor<\/code> nesnesinin uygun <code>visit()<\/code> metodunu \u00e7a\u011f\u0131r\u0131r: <code>visitor.visit(this)<\/code>.<br \/>\n4.  Bu noktada, <code>visitor<\/code> nesnesi bir <code>ConcreteVisitor<\/code> t\u00fcr\u00fcndedir ve <code>this<\/code> anahtar kelimesiyle ge\u00e7irilen <code>Element<\/code> nesnesinin somut t\u00fcr\u00fc (\u00f6rne\u011fin, <code>Circle<\/code>) bilinmektedir. Java&#8217;daki metot a\u015f\u0131r\u0131 y\u00fcklemesi (overloading) sayesinde, <code>ConcreteVisitor<\/code> s\u0131n\u0131f\u0131 i\u00e7indeki, <code>Circle<\/code> tipinde bir parametre alan <code>visit()<\/code> metodu otomatik olarak se\u00e7ilir ve \u00e7a\u011fr\u0131l\u0131r.<\/p>\n<p>B\u00f6ylece, <code>accept()<\/code> \u00e7a\u011fr\u0131s\u0131 ilk da\u011f\u0131t\u0131m\u0131 (Element&#8217;in t\u00fcr\u00fcne g\u00f6re), <code>visit()<\/code> \u00e7a\u011fr\u0131s\u0131 ise ikinci da\u011f\u0131t\u0131m\u0131 (Visitor&#8217;\u0131n t\u00fcr\u00fcne g\u00f6re) ger\u00e7ekle\u015ftirir. Bu sayede, <code>Element<\/code> s\u0131n\u0131flar\u0131 kendi i\u00e7 operasyonlar\u0131n\u0131 tan\u0131mlamak zorunda kalmazken, <code>Visitor<\/code> s\u0131n\u0131flar\u0131 da farkl\u0131 <code>Element<\/code> t\u00fcrleri i\u00e7in \u00f6zel davran\u0131\u015flar sergileyebilir.<\/p>\n<h3>Java&#8217;da Uygulama \u00d6rne\u011fi<\/h3>\n<p>Yukar\u0131da bahsedilen \u015fekil \u00f6rne\u011fi \u00fczerinden Visitor desenini Java&#8217;da ad\u0131m ad\u0131m uygulayal\u0131m.<\/p>\n<p><strong>1. Element Aray\u00fcz\u00fc ve Somut Element S\u0131n\u0131flar\u0131:<\/strong><\/p>\n<p>\u00d6ncelikle, ziyaret edilebilir nesneleri tan\u0131mlayan <code>Element<\/code> aray\u00fcz\u00fcn\u00fc ve somut \u015fekil s\u0131n\u0131flar\u0131n\u0131 olu\u015ftural\u0131m.<\/p>\n<pre><code class=\"language-java\">\/\/ 1. Element Aray\u00fcz\u00fc\ninterface ShapeElement {\n    void accept(ShapeVisitor visitor);\n}\n\n\/\/ 2. Somut Element S\u0131n\u0131flar\u0131\nclass Circle implements ShapeElement {\n    private double radius;\n\n    public Circle(double radius) {\n        this.radius = radius;\n    }\n\n    public double getRadius() {\n        return radius;\n    }\n\n    @Override\n    public void accept(ShapeVisitor visitor) {\n        visitor.visit(this); \/\/ \u00c7ift da\u011f\u0131t\u0131m\u0131n ilk ad\u0131m\u0131\n    }\n}\n\nclass Rectangle implements ShapeElement {\n    private double width;\n    private double height;\n\n    public Rectangle(double width, double height) {\n        this.width = width;\n        this.height = height;\n    }\n\n    public double getWidth() {\n        return width;\n    }\n\n    public double getHeight() {\n        return height;\n    }\n\n    @Override\n    public void accept(ShapeVisitor visitor) {\n        visitor.visit(this); \/\/ \u00c7ift da\u011f\u0131t\u0131m\u0131n ilk ad\u0131m\u0131\n    }\n}\n\nclass Triangle implements ShapeElement {\n    private double base;\n    private double height;\n    private double side1;\n    private double side2;\n\n    public Triangle(double base, double height, double side1, double side2) {\n        this.base = base;\n        this.height = height;\n        this.side1 = side1;\n        this.side2 = side2;\n    }\n\n    public double getBase() {\n        return base;\n    }\n\n    public double getHeight() {\n        return height;\n    }\n\n    public double getSide1() {\n        return side1;\n    }\n\n    public double getSide2() {\n        return side2;\n    }\n\n    @Override\n    public void accept(ShapeVisitor visitor) {\n        visitor.visit(this); \/\/ \u00c7ift da\u011f\u0131t\u0131m\u0131n ilk ad\u0131m\u0131\n    }\n}<\/code><\/pre>\n<p><strong>2. Visitor Aray\u00fcz\u00fc:<\/strong><\/p>\n<p>\u015eimdi, her bir somut <code>Element<\/code> t\u00fcr\u00fc i\u00e7in <code>visit()<\/code> metodu tan\u0131mlayan <code>Visitor<\/code> aray\u00fcz\u00fcn\u00fc olu\u015ftural\u0131m.<\/p>\n<pre><code class=\"language-java\">\/\/ 3. Visitor Aray\u00fcz\u00fc\ninterface ShapeVisitor {\n    void visit(Circle circle);\n    void visit(Rectangle rectangle);\n    void visit(Triangle triangle);\n    \/\/ Yeni bir \u015fekil eklendi\u011finde buraya da yeni bir visit metodu eklenmesi gerekecek.\n}<\/code><\/pre>\n<p><strong>3. Somut Visitor S\u0131n\u0131flar\u0131:<\/strong><\/p>\n<p>Farkl\u0131 i\u015flemler i\u00e7in somut <code>Visitor<\/code> s\u0131n\u0131flar\u0131n\u0131 olu\u015ftural\u0131m.<\/p>\n<pre><code class=\"language-java\">\/\/ 4. Somut Visitor S\u0131n\u0131flar\u0131 - Alan Hesaplay\u0131c\u0131\nclass AreaCalculatorVisitor implements ShapeVisitor {\n    private double totalArea = 0;\n\n    @Override\n    public void visit(Circle circle) {\n        totalArea += Math.PI <em> circle.getRadius() <\/em> circle.getRadius();\n        System.out.println(\"\u00c7ember alan\u0131 hesapland\u0131: \" + (Math.PI <em> circle.getRadius() <\/em> circle.getRadius()));\n    }\n\n    @Override\n    public void visit(Rectangle rectangle) {\n        totalArea += rectangle.getWidth() * rectangle.getHeight();\n        System.out.println(\"Dikd\u00f6rtgen alan\u0131 hesapland\u0131: \" + (rectangle.getWidth() * rectangle.getHeight()));\n    }\n\n    @Override\n    public void visit(Triangle triangle) {\n        totalArea += 0.5 <em> triangle.getBase() <\/em> triangle.getHeight();\n        System.out.println(\"\u00dc\u00e7gen alan\u0131 hesapland\u0131: \" + (0.5 <em> triangle.getBase() <\/em> triangle.getHeight()));\n    }\n\n    public double getTotalArea() {\n        return totalArea;\n    }\n}\n\n\/\/ 4. Somut Visitor S\u0131n\u0131flar\u0131 - XML D\u0131\u015fa Aktar\u0131c\u0131\nclass XmlExportVisitor implements ShapeVisitor {\n    private StringBuilder xmlOutput = new StringBuilder();\n\n    @Override\n    public void visit(Circle circle) {\n        xmlOutput.append(\"<circle radius=\\\"\").append(circle.getRadius()).append(\"\\\"\/>\\n\");\n        System.out.println(\"\u00c7ember XML'e d\u00f6n\u00fc\u015ft\u00fcr\u00fcld\u00fc.\");\n    }\n\n    @Override\n    public void visit(Rectangle rectangle) {\n        xmlOutput.append(\"<rectangle width=\\\"\").append(rectangle.getWidth())\n                 .append(\"\\\" height=\\\"\").append(rectangle.getHeight()).append(\"\\\"\/>\\n\");\n        System.out.println(\"Dikd\u00f6rtgen XML'e d\u00f6n\u00fc\u015ft\u00fcr\u00fcld\u00fc.\");\n    }\n\n    @Override\n    public void visit(Triangle triangle) {\n        xmlOutput.append(\"<triangle base=\\\"\").append(triangle.getBase())\n                 .append(\"\\\" height=\\\"\").append(triangle.getHeight())\n                 .append(\"\\\" side1=\\\"\").append(triangle.getSide1())\n                 .append(\"\\\" side2=\\\"\").append(triangle.getSide2()).append(\"\\\"\/>\\n\");\n        System.out.println(\"\u00dc\u00e7gen XML'e d\u00f6n\u00fc\u015ft\u00fcr\u00fcld\u00fc.\");\n    }\n\n    public String getXmlOutput() {\n        return \"<shapes>\\n\" + xmlOutput.toString() + \"<\/shapes>\";\n    }\n}\n\n\/\/ 4. Somut Visitor S\u0131n\u0131flar\u0131 - JSON D\u0131\u015fa Aktar\u0131c\u0131 (Yeni bir i\u015flem)\nclass JsonExportVisitor implements ShapeVisitor {\n    private StringBuilder jsonOutput = new StringBuilder();\n\n    @Override\n    public void visit(Circle circle) {\n        jsonOutput.append(\"  {\\\"type\\\": \\\"circle\\\", \\\"radius\\\": \").append(circle.getRadius()).append(\"},\\n\");\n        System.out.println(\"\u00c7ember JSON'a d\u00f6n\u00fc\u015ft\u00fcr\u00fcld\u00fc.\");\n    }\n\n    @Override\n    public void visit(Rectangle rectangle) {\n        jsonOutput.append(\"  {\\\"type\\\": \\\"rectangle\\\", \\\"width\\\": \").append(rectangle.getWidth())\n                  .append(\", \\\"height\\\": \").append(rectangle.getHeight()).append(\"},\\n\");\n        System.out.println(\"Dikd\u00f6rtgen JSON'a d\u00f6n\u00fc\u015ft\u00fcr\u00fcld\u00fc.\");\n    }\n\n    @Override\n    public void visit(Triangle triangle) {\n        jsonOutput.append(\"  {\\\"type\\\": \\\"triangle\\\", \\\"base\\\": \").append(triangle.getBase())\n                  .append(\", \\\"height\\\": \").append(triangle.getHeight())\n                  .append(\", \\\"side1\\\": \").append(triangle.getSide1())\n                  .append(\", \\\"side2\\\": \").append(triangle.getSide2()).append(\"},\\n\");\n        System.out.println(\"\u00dc\u00e7gen JSON'a d\u00f6n\u00fc\u015ft\u00fcr\u00fcld\u00fc.\");\n    }\n\n    public String getJsonOutput() {\n        \/\/ Son virg\u00fcl\u00fc kald\u0131r ve diziyi kapat\n        String finalOutput = jsonOutput.toString();\n        if (finalOutput.endsWith(\",\\n\")) {\n            finalOutput = finalOutput.substring(0, finalOutput.length() - 2);\n        }\n        return \"[\\n\" + finalOutput + \"\\n]\";\n    }\n}<\/code><\/pre>\n<p><strong>4. Kullan\u0131m (Client Kodu):<\/strong><\/p>\n<p>\u015eimdi bu deseni nas\u0131l kullanaca\u011f\u0131m\u0131za bakal\u0131m. <code>main<\/code> metodunda bir dizi \u015fekil olu\u015fturup, farkl\u0131 ziyaret\u00e7ilerle bu \u015fekiller \u00fczerinde i\u015flemler ger\u00e7ekle\u015ftirebiliriz.<\/p>\n<pre><code class=\"language-java\">\/\/ Main s\u0131n\u0131f\u0131\npublic class VisitorPatternDemo {\n    public static void main(String[] args) {\n        \/\/ \u015eekil listesi olu\u015fturma\n        List<ShapeElement> shapes = new ArrayList<>();\n        shapes.add(new Circle(5.0));\n        shapes.add(new Rectangle(4.0, 6.0));\n        shapes.add(new Triangle(3.0, 4.0, 5.0, 5.0));\n        shapes.add(new Circle(7.0));\n\n        System.out.println(\"--- Alan Hesaplama ---\");\n        AreaCalculatorVisitor areaCalculator = new AreaCalculatorVisitor();\n        for (ShapeElement shape : shapes) {\n            shape.accept(areaCalculator);\n        }\n        System.out.println(\"Toplam Alan: \" + areaCalculator.getTotalArea());\n        System.out.println(\"\\n\");\n\n        System.out.println(\"--- XML D\u0131\u015fa Aktarma ---\");\n        XmlExportVisitor xmlExporter = new XmlExportVisitor();\n        for (ShapeElement shape : shapes) {\n            shape.accept(xmlExporter);\n        }\n        System.out.println(\"XML \u00c7\u0131kt\u0131s\u0131:\\n\" + xmlExporter.getXmlOutput());\n        System.out.println(\"\\n\");\n\n        System.out.println(\"--- JSON D\u0131\u015fa Aktarma (Yeni \u0130\u015flem) ---\");\n        JsonExportVisitor jsonExporter = new JsonExportVisitor();\n        for (ShapeElement shape : shapes) {\n            shape.accept(jsonExporter);\n        }\n        System.out.println(\"JSON \u00c7\u0131kt\u0131s\u0131:\\n\" + jsonExporter.getJsonOutput());\n        System.out.println(\"\\n\");\n\n        \/\/ Diyelim ki yeni bir i\u015flem eklemek istiyoruz: \u015eekillerin \u00e7evresini hesaplamak.\n        \/\/ Mevcut ShapeElement s\u0131n\u0131flar\u0131n\u0131 de\u011fi\u015ftirmeden yeni bir Visitor ekleyebiliriz.\n        System.out.println(\"--- \u00c7evre Hesaplama (Yeni Ziyaret\u00e7i) ---\");\n        PerimeterCalculatorVisitor perimeterCalculator = new PerimeterCalculatorVisitor();\n        for (ShapeElement shape : shapes) {\n            shape.accept(perimeterCalculator);\n        }\n        System.out.println(\"Toplam \u00c7evre: \" + perimeterCalculator.getTotalPerimeter());\n    }\n}\n\n\/\/ Yeni bir ziyaret\u00e7i s\u0131n\u0131f\u0131: \u00c7evre Hesaplay\u0131c\u0131\nclass PerimeterCalculatorVisitor implements ShapeVisitor {\n    private double totalPerimeter = 0;\n\n    @Override\n    public void visit(Circle circle) {\n        totalPerimeter += 2 <em> Math.PI <\/em> circle.getRadius();\n        System.out.println(\"\u00c7ember \u00e7evresi hesapland\u0131: \" + (2 <em> Math.PI <\/em> circle.getRadius()));\n    }\n\n    @Override\n    public void visit(Rectangle rectangle) {\n        totalPerimeter += 2 * (rectangle.getWidth() + rectangle.getHeight());\n        System.out.println(\"Dikd\u00f6rtgen \u00e7evresi hesapland\u0131: \" + (2 * (rectangle.getWidth() + rectangle.getHeight())));\n    }\n\n    @Override\n    public void visit(Triangle triangle) {\n        \/\/ \u00dc\u00e7genin \u00e7evresi i\u00e7in t\u00fcm kenarlar\u0131n toplam\u0131 gerekir.\n        \/\/ \u00d6rne\u011fimizde sadece taban ve y\u00fckseklik var, kenarlar side1 ve side2 olarak varsayal\u0131m.\n        totalPerimeter += triangle.getBase() + triangle.getSide1() + triangle.getSide2();\n        System.out.println(\"\u00dc\u00e7gen \u00e7evresi hesapland\u0131: \" + (triangle.getBase() + triangle.getSide1() + triangle.getSide2()));\n    }\n\n    public double getTotalPerimeter() {\n        return totalPerimeter;\n    }\n}<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte g\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, <code>AreaCalculatorVisitor<\/code>, <code>XmlExportVisitor<\/code>, <code>JsonExportVisitor<\/code> ve <code>PerimeterCalculatorVisitor<\/code> s\u0131n\u0131flar\u0131, <code>Circle<\/code>, <code>Rectangle<\/code> ve <code>Triangle<\/code> s\u0131n\u0131flar\u0131n\u0131n i\u00e7 yap\u0131s\u0131n\u0131 de\u011fi\u015ftirmeden bu \u015fekiller \u00fczerinde farkl\u0131 operasyonlar ger\u00e7ekle\u015ftirebilmektedir. Yeni bir operasyon eklemek istedi\u011fimizde (\u00f6rne\u011fin <code>PerimeterCalculatorVisitor<\/code> gibi), sadece <code>ShapeVisitor<\/code> aray\u00fcz\u00fcn\u00fc uygulayan yeni bir s\u0131n\u0131f olu\u015fturmam\u0131z yeterli olur. Bu, <code>ShapeElement<\/code> s\u0131n\u0131flar\u0131n\u0131 ve mevcut <code>Visitor<\/code> s\u0131n\u0131flar\u0131n\u0131 de\u011fi\u015ftirmemizi gerektirmez, b\u00f6ylece A\u00e7\u0131k\/Kapal\u0131 Prensibine uyulmu\u015f olur.<\/p>\n<h3>Avantajlar\u0131<\/h3>\n<p>Visitor tasar\u0131m deseni, belirli senaryolarda \u00f6nemli avantajlar sunar:<\/p>\n<p>*   <strong>Yeni \u0130\u015flem Ekleme Kolayl\u0131\u011f\u0131 (A\u00e7\u0131k\/Kapal\u0131 Prensibi):<\/strong> Bu, desenin en b\u00fcy\u00fck avantaj\u0131d\u0131r. Bir nesne yap\u0131s\u0131na yeni bir operasyon eklemek istedi\u011finizde, mevcut <code>Element<\/code> s\u0131n\u0131flar\u0131n\u0131 de\u011fi\u015ftirmek yerine sadece yeni bir <code>ConcreteVisitor<\/code> s\u0131n\u0131f\u0131 olu\u015fturman\u0131z yeterlidir. Bu, kodun kararl\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r ve bak\u0131m maliyetlerini d\u00fc\u015f\u00fcr\u00fcr.<br \/>\n*   <strong>\u0130lgili \u0130\u015flemleri Gruplama:<\/strong> Bir nesne yap\u0131s\u0131ndaki farkl\u0131 \u00f6\u011feler \u00fczerinde ger\u00e7ekle\u015ftirilen t\u00fcm ilgili operasyonlar\u0131 tek bir <code>Visitor<\/code> s\u0131n\u0131f\u0131nda toplar. \u00d6rne\u011fin, bir derleyicinin tip kontrol\u00fc ile ilgili t\u00fcm mant\u0131\u011f\u0131 tek bir <code>TypeCheckVisitor<\/code> s\u0131n\u0131f\u0131nda toplanabilir. Bu, kodun mod\u00fclerli\u011fini ve okunabilirli\u011fini art\u0131r\u0131r.<br \/>\n*   <strong>Nesne Yap\u0131s\u0131 \u00dczerinde Gezinme Mant\u0131\u011f\u0131n\u0131 Ay\u0131rma:<\/strong> Karma\u015f\u0131k nesne yap\u0131lar\u0131nda (\u00f6rne\u011fin, a\u011fa\u00e7lar) gezinme (traversal) mant\u0131\u011f\u0131, <code>Element<\/code> s\u0131n\u0131flar\u0131n\u0131n kendisi yerine <code>Visitor<\/code> veya yard\u0131mc\u0131 bir s\u0131n\u0131f taraf\u0131ndan y\u00f6netilebilir. Bu, sorumluluklar\u0131n daha net ayr\u0131lmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>Tip G\u00fcvenli\u011fi:<\/strong> <code>Visitor<\/code> aray\u00fcz\u00fcndeki <code>visit()<\/code> metotlar\u0131, her <code>Element<\/code> t\u00fcr\u00fc i\u00e7in \u00f6zel olarak tan\u0131mland\u0131\u011f\u0131ndan, derleme zaman\u0131nda tip kontrol\u00fc sa\u011flan\u0131r. Bu, \u00e7al\u0131\u015fma zaman\u0131 hatalar\u0131n\u0131 azaltmaya yard\u0131mc\u0131 olur.<br \/>\n*   <strong>Esneklik:<\/strong> Karma\u015f\u0131k nesne yap\u0131lar\u0131 \u00fczerinde \u00e7al\u0131\u015f\u0131rken ve bu yap\u0131lar \u00fczerinde \u00e7ok say\u0131da farkl\u0131, ba\u011f\u0131ms\u0131z i\u015flem yap\u0131lmas\u0131 gerekti\u011finde y\u00fcksek esneklik sunar. Her i\u015flem kendi <code>Visitor<\/code>&#8216;\u0131nda izole edilmi\u015f olur.<br \/>\n*   <strong>\u0130\u015flem Durumu Y\u00f6netimi:<\/strong> <code>Visitor<\/code> s\u0131n\u0131flar\u0131, ziyaret ettikleri elemanlar aras\u0131nda durum tutabilir. \u00d6rne\u011fin, <code>AreaCalculatorVisitor<\/code> toplam alan\u0131 tutarken, <code>XmlExportVisitor<\/code> olu\u015fturulan XML \u00e7\u0131kt\u0131s\u0131n\u0131 biriktirebilir.<\/p>\n<h3>Dezavantajlar\u0131<\/h3>\n<p>Visitor deseni g\u00fc\u00e7l\u00fc bir ara\u00e7 olmas\u0131na ra\u011fmen, baz\u0131 dezavantajlar\u0131 da beraberinde getirir:<\/p>\n<p><em>   <strong>Yeni Element Ekleme Zorlu\u011fu:<\/strong> Desen, yeni i\u015flemler eklemeyi kolayla\u015ft\u0131r\u0131rken, nesne yap\u0131s\u0131na yeni bir <code>ConcreteElement<\/code> s\u0131n\u0131f\u0131 eklemeyi zorla\u015ft\u0131r\u0131r. Yeni bir <code>Element<\/code> t\u00fcr\u00fc eklendi\u011finde, <code>Visitor<\/code> aray\u00fcz\u00fcne yeni bir <code>visit()<\/code> metodu eklenmesi ve bu aray\u00fcz\u00fc uygulayan <\/em>t\u00fcm mevcut <code>ConcreteVisitor<\/code> s\u0131n\u0131flar\u0131n\u0131n* g\u00fcncellenmesi gerekir. Bu, \u00e7ok say\u0131da ziyaret\u00e7i s\u0131n\u0131f\u0131 oldu\u011funda \u00f6nemli bir bak\u0131m y\u00fck\u00fc olu\u015fturabilir. Bu durum, Visitor deseninin temel varsay\u0131m\u0131n\u0131n, eleman yap\u0131s\u0131n\u0131n s\u0131k de\u011fi\u015fmeyece\u011fi, ancak elemanlar \u00fczerindeki operasyonlar\u0131n s\u0131k de\u011fi\u015fece\u011fi y\u00f6n\u00fcnde oldu\u011funu g\u00f6sterir.<br \/>\n*   <strong>Kaps\u00fclleme \u0130hlali (Potansiyel):<\/strong> <code>Visitor<\/code>&#8216;\u0131n <code>Element<\/code>&#8216;ler \u00fczerinde i\u015flem yapabilmesi i\u00e7in, <code>Element<\/code> s\u0131n\u0131flar\u0131n\u0131n i\u00e7 durumuna eri\u015fmesi gerekebilir. Bu, <code>Element<\/code> s\u0131n\u0131flar\u0131n\u0131n normalde gizli tutulmas\u0131 gereken baz\u0131 i\u00e7 detaylar\u0131n\u0131 <code>Visitor<\/code>&#8216;a a\u00e7may\u0131 gerektirebilir (\u00f6rne\u011fin, <code>getRadius()<\/code>, <code>getWidth()<\/code>, <code>getHeight()<\/code> gibi getter metotlar\u0131 arac\u0131l\u0131\u011f\u0131yla). Bu durum, <code>Element<\/code> s\u0131n\u0131flar\u0131n\u0131n kaps\u00fcllemesini zay\u0131flatabilir.<br \/>\n*   <strong>Karma\u015f\u0131kl\u0131k:<\/strong> Basit durumlar veya sadece birka\u00e7 i\u015flem i\u00e7in Visitor deseni gereksiz yere karma\u015f\u0131k olabilir. K\u00fc\u00e7\u00fck bir i\u015flem i\u00e7in bile bir <code>Element<\/code> aray\u00fcz\u00fc, <code>Visitor<\/code> aray\u00fcz\u00fc ve birden fazla somut s\u0131n\u0131f olu\u015fturmak, kodun genel karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 art\u0131rabilir.<br \/>\n*   <strong>Geriye D\u00f6n\u00fck Uyumluluk Sorunlar\u0131:<\/strong> Mevcut bir k\u00fct\u00fcphaneye veya API&#8217;ye sonradan Visitor deseni eklemek genellikle zordur, \u00e7\u00fcnk\u00fc <code>Element<\/code> aray\u00fcz\u00fcne <code>accept()<\/code> metodunun eklenmesi gerekir. Bu, k\u00fct\u00fcphanenin t\u00fcm kullan\u0131c\u0131lar\u0131 i\u00e7in geriye d\u00f6n\u00fck uyumlulu\u011fu bozabilir.<\/p>\n<h3>Ne Zaman Kullan\u0131l\u0131r?<\/h3>\n<p>Visitor tasar\u0131m deseni, a\u015fa\u011f\u0131daki ko\u015fullar kar\u015f\u0131land\u0131\u011f\u0131nda etkili bir \u015fekilde kullan\u0131labilir:<\/p>\n<p>*   <strong>Nesne Yap\u0131s\u0131 \u00dczerinde \u00c7ok Say\u0131da Farkl\u0131 ve Ba\u011f\u0131ms\u0131z \u0130\u015flem Yap\u0131lmas\u0131 Gerekti\u011finde:<\/strong> Bir nesne yap\u0131s\u0131ndaki (\u00f6rne\u011fin, karma\u015f\u0131k bir a\u011fa\u00e7 veya grafik) \u00f6\u011feler \u00fczerinde birden fazla, farkl\u0131 ve birbirinden ba\u011f\u0131ms\u0131z operasyon ger\u00e7ekle\u015ftirmek istedi\u011finizde.<br \/>\n*   <strong>Nesne Yap\u0131s\u0131n\u0131n Stabil Oldu\u011fu, Ancak \u0130\u015flemlerin S\u0131k Eklendi\u011fi Durumlarda:<\/strong> Ziyaret edilecek nesnelerin s\u0131n\u0131flar\u0131 (Elementler) nadiren de\u011fi\u015fiyorsa, ancak bu nesneler \u00fczerinde ger\u00e7ekle\u015ftirilecek yeni operasyonlar (Visitorlar) s\u0131k s\u0131k ekleniyorsa idealdir.<br \/>\n*   <strong>\u0130lgili \u0130\u015flemleri Bir Arada Tutmak \u0130stendi\u011finde:<\/strong> Belirli bir kategoriye ait t\u00fcm operasyonlar\u0131 tek bir s\u0131n\u0131f i\u00e7inde (bir <code>ConcreteVisitor<\/code>) toplamak, kodun organizasyonunu ve okunabilirli\u011fini art\u0131r\u0131r.<br \/>\n*   <strong>Nesne Yap\u0131s\u0131n\u0131n Eleman T\u00fcrlerinin Sabit Oldu\u011fu Durumlarda:<\/strong> <code>Visitor<\/code> aray\u00fcz\u00fcn\u00fcn her <code>Element<\/code> t\u00fcr\u00fc i\u00e7in bir <code>visit()<\/code> metodu i\u00e7ermesi gerekti\u011finden, <code>Element<\/code> t\u00fcrlerinin say\u0131s\u0131 ve yap\u0131s\u0131 nispeten sabit olmal\u0131d\u0131r. Yeni bir <code>Element<\/code> t\u00fcr\u00fc eklemek, t\u00fcm <code>Visitor<\/code> s\u0131n\u0131flar\u0131n\u0131 g\u00fcncellemek anlam\u0131na gelir.<br \/>\n*   <strong>Nesne Yap\u0131s\u0131 \u00dczerinde Gezinme Mant\u0131\u011f\u0131n\u0131n Ayr\u0131 Tutulmas\u0131 \u0130stendi\u011finde:<\/strong> Gezinme (traversal) mant\u0131\u011f\u0131, eleman s\u0131n\u0131flar\u0131ndan ayr\u0131 bir yerde tutulabilir, bu da sorumluluklar\u0131n ayr\u0131lmas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<h3>\u0130lgili Tasar\u0131m Desenleri<\/h3>\n<p>Visitor deseni, di\u011fer baz\u0131 tasar\u0131m desenleriyle birlikte veya onlarla ili\u015fkili olarak s\u0131k\u00e7a kullan\u0131l\u0131r:<\/p>\n<p>*   <strong>Composite Deseni:<\/strong> Visitor deseni genellikle Composite deseni ile birlikte kullan\u0131l\u0131r. Composite deseni, nesneleri a\u011fa\u00e7 yap\u0131lar\u0131 halinde d\u00fczenlemeye olanak tan\u0131r (\u00f6rne\u011fin, bir klas\u00f6r ve dosya hiyerar\u015fisi veya bir GUI bile\u015fen a\u011fac\u0131). Visitor deseni ise bu Composite yap\u0131s\u0131 \u00fczerinde gezinerek ve farkl\u0131 d\u00fc\u011f\u00fcm t\u00fcrleri \u00fczerinde i\u015flemler ger\u00e7ekle\u015ftirerek i\u015flevsellik sa\u011flar. <code>accept()<\/code> metodu, Composite yap\u0131s\u0131n\u0131n hem yaprak (leaf) hem de bile\u015fik (composite) d\u00fc\u011f\u00fcmlerinde uygulanabilir.<br \/>\n*   <strong>Iterator Deseni:<\/strong> Visitor deseni, bir nesne yap\u0131s\u0131 \u00fczerinde gezinmek i\u00e7in bir <code>Iterator<\/code> desenini kullanabilir. <code>Iterator<\/code>, yap\u0131n\u0131n elemanlar\u0131n\u0131 s\u0131rayla ziyaret ederken, her eleman\u0131 bir <code>Visitor<\/code>&#8216;a paslayabilir. Bu, gezinme mant\u0131\u011f\u0131n\u0131 ve i\u015flem mant\u0131\u011f\u0131n\u0131 daha da ay\u0131r\u0131r.<br \/>\n*   <strong>Factory Method \/ Abstract Factory Deseni:<\/strong> <code>Visitor<\/code> nesnelerinin veya <code>Element<\/code> nesnelerinin olu\u015fturulmas\u0131, <code>Factory Method<\/code> veya <code>Abstract Factory<\/code> desenleri kullan\u0131larak soyutlanabilir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Visitor tasar\u0131m deseni, bir nesne yap\u0131s\u0131n\u0131n elemanlar\u0131 \u00fczerinde yeni operasyonlar tan\u0131mlaman\u0131n, bu elemanlar\u0131n s\u0131n\u0131flar\u0131n\u0131 de\u011fi\u015ftirmeden m\u00fcmk\u00fcn k\u0131lan g\u00fc\u00e7l\u00fc ve esnek bir \u00e7\u00f6z\u00fcmd\u00fcr. \u00d6zellikle nesne yap\u0131s\u0131n\u0131n kendisi s\u0131k de\u011fi\u015fmezken, bu yap\u0131 \u00fczerinde ger\u00e7ekle\u015ftirilmesi gereken i\u015flemlerin s\u0131k eklendi\u011fi veya de\u011fi\u015fti\u011fi senaryolarda parlak bir se\u00e7imdir. A\u00e7\u0131k\/Kapal\u0131 Prensibine uyumu, kodun geni\u015fletilebilirli\u011fini ve bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<p>Ancak, desenin dezavantajlar\u0131 da g\u00f6z \u00f6n\u00fcnde bulundurulmal\u0131d\u0131r. Yeni bir <code>Element<\/code> t\u00fcr\u00fc eklemenin getirdi\u011fi zorluk ve potansiyel kaps\u00fclleme ihlali, bu deseni kullanmadan \u00f6nce dikkatlice de\u011ferlendirilmesi gereken fakt\u00f6rlerdir. Karma\u015f\u0131kl\u0131\u011f\u0131 nedeniyle, basit durumlar i\u00e7in gereksiz olabilir.<\/p>\n<p>Sonu\u00e7 olarak, Visitor deseni, do\u011fru senaryoda uyguland\u0131\u011f\u0131nda, karma\u015f\u0131k sistemlerde mod\u00fclerli\u011fi, esnekli\u011fi ve s\u00fcrd\u00fcr\u00fclebilirli\u011fi \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131ran de\u011ferli bir ara\u00e7t\u0131r. Java&#8217;da \u00e7ift da\u011f\u0131t\u0131m mekanizmas\u0131n\u0131 kullanarak, dinamik ve tip g\u00fcvenli operasyon ayr\u0131m\u0131 sa\u011flar, bu da onu \u00f6zellikle derleyiciler ve di\u011fer karma\u015f\u0131k veri i\u015fleme uygulamalar\u0131 i\u00e7in vazge\u00e7ilmez k\u0131lar.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Visitor Tasar\u0131m Deseni Java&#8217;da\nYaz\u0131l\u0131m geli\u015ftirmede, kodun esnekli\u011fini, bak\u0131m\u0131n\u0131 ve geni\u015fletilebilirli\u011fini art\u0131rmak amac\u0131yla \u00e7e\u015fitli ta","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1408],"tags":[],"class_list":{"0":"post-39392","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-java","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Visitor Tasar\u0131m Deseni Java&#039;da - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/visitor-tasarim-deseni-javada\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Visitor Tasar\u0131m Deseni Java&#039;da\" \/>\n<meta property=\"og:description\" content=\"Visitor Tasar\u0131m Deseni Java&#039;da Yaz\u0131l\u0131m geli\u015ftirmede, kodun esnekli\u011fini, bak\u0131m\u0131n\u0131 ve geni\u015fletilebilirli\u011fini art\u0131rmak amac\u0131yla \u00e7e\u015fitli ta\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/visitor-tasarim-deseni-javada\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-20T10:40:48+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/visitor-tasarim-deseni-javada\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/visitor-tasarim-deseni-javada\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Visitor Tasar\u0131m Deseni Java&#8217;da\",\"datePublished\":\"2026-02-20T10:40:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/visitor-tasarim-deseni-javada\/\"},\"wordCount\":2628,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Java\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/visitor-tasarim-deseni-javada\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/visitor-tasarim-deseni-javada\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/visitor-tasarim-deseni-javada\/\",\"name\":\"Visitor Tasar\u0131m Deseni Java'da - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-20T10:40:48+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/visitor-tasarim-deseni-javada\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/visitor-tasarim-deseni-javada\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/visitor-tasarim-deseni-javada\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Visitor Tasar\u0131m Deseni Java&#8217;da\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Visitor Tasar\u0131m Deseni Java'da - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/visitor-tasarim-deseni-javada\/","og_locale":"tr_TR","og_type":"article","og_title":"Visitor Tasar\u0131m Deseni Java'da","og_description":"Visitor Tasar\u0131m Deseni Java'da Yaz\u0131l\u0131m geli\u015ftirmede, kodun esnekli\u011fini, bak\u0131m\u0131n\u0131 ve geni\u015fletilebilirli\u011fini art\u0131rmak amac\u0131yla \u00e7e\u015fitli ta","og_url":"https:\/\/fatihsoysal.com\/blog\/visitor-tasarim-deseni-javada\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-20T10:40:48+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/visitor-tasarim-deseni-javada\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/visitor-tasarim-deseni-javada\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Visitor Tasar\u0131m Deseni Java&#8217;da","datePublished":"2026-02-20T10:40:48+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/visitor-tasarim-deseni-javada\/"},"wordCount":2628,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Java"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/visitor-tasarim-deseni-javada\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/visitor-tasarim-deseni-javada\/","url":"https:\/\/fatihsoysal.com\/blog\/visitor-tasarim-deseni-javada\/","name":"Visitor Tasar\u0131m Deseni Java'da - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-20T10:40:48+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/visitor-tasarim-deseni-javada\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/visitor-tasarim-deseni-javada\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/visitor-tasarim-deseni-javada\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Visitor Tasar\u0131m Deseni Java&#8217;da"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39392","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=39392"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39392\/revisions"}],"predecessor-version":[{"id":39393,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39392\/revisions\/39393"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=39392"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=39392"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=39392"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}