{"id":38180,"date":"2026-01-25T07:40:52","date_gmt":"2026-01-25T04:40:52","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=38180"},"modified":"2026-01-25T07:40:52","modified_gmt":"2026-01-25T04:40:52","slug":"decorator-tasarim-deseni-javada-esnek-ve-genisletilebilir-siniflar-olusturma","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/decorator-tasarim-deseni-javada-esnek-ve-genisletilebilir-siniflar-olusturma\/","title":{"rendered":"Decorator Tasar\u0131m Deseni: Java&#8217;da Esnek ve Geni\u015fletilebilir S\u0131n\u0131flar Olu\u015fturma"},"content":{"rendered":"<p><body><\/p>\n<h2>Decorator Tasar\u0131m Deseni: Java&#8217;da Esnek ve Geni\u015fletilebilir S\u0131n\u0131flar Olu\u015fturma<\/h2>\n<h2>Giri\u015f<\/h2>\n<p>Yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, de\u011fi\u015fen gereksinimlere uyum sa\u011flayabilen, bak\u0131m\u0131 kolay ve geni\u015fletilebilir sistemler in\u015fa etmek b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Bu hedefe ula\u015fmak i\u00e7in tasar\u0131m desenleri, yaz\u0131l\u0131mc\u0131lara kan\u0131tlanm\u0131\u015f \u00e7\u00f6z\u00fcmler sunan g\u00fc\u00e7l\u00fc ara\u00e7lard\u0131r. Tasar\u0131m desenleri, belirli bir ba\u011flamda ortaya \u00e7\u0131kan yayg\u0131n yaz\u0131l\u0131m tasar\u0131m problemlerine standart, yeniden kullan\u0131labilir \u00e7\u00f6z\u00fcmler sa\u011flayan genel yakla\u015f\u0131mlard\u0131r. Bu makalede, yap\u0131sal tasar\u0131m desenlerinden biri olan Decorator (Dekorat\u00f6r) tasar\u0131m desenini Java \u00f6zelinde derinlemesine inceleyece\u011fiz. Decorator deseni, nesnelere dinamik olarak yeni sorumluluklar eklemenin zarif bir yolunu sunar ve miras hiyerar\u015filerinin yol a\u00e7abilece\u011fi karma\u015f\u0131kl\u0131\u011f\u0131 \u00f6nler.<\/p>\n<h3>Tasar\u0131m Desenlerine Genel Bak\u0131\u015f<\/h3>\n<p>Tasar\u0131m desenleri, yaz\u0131l\u0131m m\u00fchendisli\u011finde, belirli bir ba\u011flamda ortaya \u00e7\u0131kan yayg\u0131n sorunlara genel, yeniden kullan\u0131labilir \u00e7\u00f6z\u00fcmler sunan resmile\u015ftirilmi\u015f en iyi uygulamalard\u0131r. &#8220;Design Patterns: Elements of Reusable Object-Oriented Software&#8221; kitab\u0131yla Gang of Four (GoF) taraf\u0131ndan pop\u00fclerle\u015ftirilen bu desenler, \u00fc\u00e7 ana kategoriye ayr\u0131l\u0131r:<\/p>\n<ul>\n<li><strong>Yarat\u0131msal Desenler (Creational Patterns):<\/strong> Nesne yaratma mekanizmalar\u0131n\u0131 soyutlar. (\u00d6rn: Singleton, Factory Method, Abstract Factory, Builder, Prototype)<\/li>\n<li><strong>Yap\u0131sal Desenler (Structural Patterns):<\/strong> Nesnelerin ve s\u0131n\u0131flar\u0131n b\u00fcy\u00fck yap\u0131lar\u0131 olu\u015fturmak i\u00e7in nas\u0131l birle\u015ftirilece\u011fini a\u00e7\u0131klar. (\u00d6rn: Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy)<\/li>\n<li><strong>Davran\u0131\u015fsal Desenler (Behavioral Patterns):<\/strong> Nesneler aras\u0131ndaki ileti\u015fimi ve sorumluluk da\u011f\u0131t\u0131m\u0131n\u0131 ele al\u0131r. (\u00d6rn: Chain of Responsibility, Command, Iterator, Mediator, Memento, Observer, State, Strategy, Template Method, Visitor)<\/li>\n<\/ul>\n<p>Decorator deseni, yap\u0131sal desenler kategorisine aittir. Temel amac\u0131, mevcut bir nesnenin davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirmeden veya o nesneyi alt s\u0131n\u0131flara ay\u0131rmadan, nesnelere dinamik olarak ek sorumluluklar ve i\u015flevsellikler eklemektir.<\/p>\n<h3>Decorator Deseni Nedir?<\/h3>\n<p>Decorator deseni, bir nesneye dinamik olarak ek sorumluluklar ataman\u0131z\u0131 sa\u011flayan bir yap\u0131sal tasar\u0131m desenidir. Dekorat\u00f6rler, mevcut bir nesneyi sarmalar (wrap eder) ve onunla ayn\u0131 aray\u00fcze sahip olurlar. Bu sayede, istemci kodu, sarmalanan nesne ile dekorat\u00f6r aras\u0131nda bir fark g\u00f6rmez. Yeni \u00f6zellikler, mevcut nesnenin orijinal yap\u0131s\u0131n\u0131 de\u011fi\u015ftirmeden veya \u00e7ok say\u0131da alt s\u0131n\u0131f olu\u015fturma ihtiyac\u0131n\u0131 ortadan kald\u0131rarak eklenir.<\/p>\n<h3>Neden Decorator Deseni?<\/h3>\n<p>Bir nesneye yeni \u00f6zellikler eklemek istedi\u011fimizde genellikle iki ana yakla\u015f\u0131m d\u00fc\u015f\u00fcn\u00fcr\u00fcz: miras (inheritance) veya kompozisyon (composition). Miras, &#8220;bir t\u00fcrd\u00fcr&#8221; (is-a) ili\u015fkisini temsil ederken, kompozisyon &#8220;sahiptir&#8221; (has-a) ili\u015fkisini temsil eder. Decorator deseni, kompozisyonu kullanarak esneklik sa\u011flar ve miras\u0131n getirdi\u011fi baz\u0131 s\u0131n\u0131rl\u0131l\u0131klar\u0131 a\u015far.<\/p>\n<p>Miras yoluyla \u00f6zellik eklemek, \u00f6zellikle \u00e7ok say\u0131da olas\u0131 \u00f6zellik kombinasyonu oldu\u011funda, bir &#8220;s\u0131n\u0131f patlamas\u0131&#8221; (class explosion) sorununa yol a\u00e7abilir. \u00d6rne\u011fin, bir kahve d\u00fckkan\u0131 uygulamas\u0131 d\u00fc\u015f\u00fcn\u00fcn. S\u00fct, \u015feker, \u00e7ikolata gibi ekstralarla kahve \u00e7e\u015fitlerini modellemek istedi\u011finizde, her olas\u0131 kombinasyon i\u00e7in ayr\u0131 bir alt s\u0131n\u0131f olu\u015fturman\u0131z gerekebilir (S\u00fctl\u00fcEspresso, \u015eekerliFiltreKahve, S\u00fctl\u00fc\u015eekerliEspresso vb.). Bu, hem kodun karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 art\u0131r\u0131r hem de yeni bir ekstra eklendi\u011finde mevcut hiyerar\u015fiyi de\u011fi\u015ftirmeyi gerektirir. Decorator deseni, bu t\u00fcr senaryolarda daha esnek ve y\u00f6netilebilir bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<h2>Problem Durumu: Miras Hiyerar\u015fisinin S\u0131n\u0131rl\u0131l\u0131klar\u0131<\/h2>\n<p>Bir yaz\u0131l\u0131m sisteminde, temel bir bile\u015fene \u00e7e\u015fitli \u00f6zellikler eklemek istendi\u011finde, miras (inheritance) ilk akla gelen y\u00f6ntem olabilir. Ancak, bu yakla\u015f\u0131m belirli senaryolarda \u00f6nemli s\u0131n\u0131rl\u0131l\u0131klar ve zorluklar yarat\u0131r.<\/p>\n<h3>Miras Hiyerar\u015fisinin S\u0131n\u0131rl\u0131l\u0131klar\u0131<\/h3>\n<p>Miras, nesne y\u00f6nelimli programlaman\u0131n temel ta\u015flar\u0131ndan biri olmas\u0131na ra\u011fmen, a\u015f\u0131r\u0131 veya yanl\u0131\u015f kullan\u0131ld\u0131\u011f\u0131nda sorunlara yol a\u00e7abilir:<\/p>\n<ul>\n<li><strong>Statik Sorumluluklar:<\/strong> Miras yoluyla eklenen sorumluluklar derleme zaman\u0131nda belirlenir ve \u00e7al\u0131\u015fma zaman\u0131nda dinamik olarak de\u011fi\u015ftirilemez. Bir nesne olu\u015fturulduktan sonra davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirmek zordur.<\/li>\n<li><strong>S\u0131n\u0131f Patlamas\u0131 (Class Explosion):<\/strong> Bir temel s\u0131n\u0131f\u0131n birden fazla farkl\u0131 \u00f6zelli\u011fi varsa ve bu \u00f6zelliklerin farkl\u0131 kombinasyonlar\u0131 m\u00fcmk\u00fcnse, her kombinasyon i\u00e7in ayr\u0131 bir alt s\u0131n\u0131f olu\u015fturmak zorunda kalabilirsiniz. Bu durum, s\u0131n\u0131f say\u0131s\u0131n\u0131 katlanarak art\u0131r\u0131r ve kod taban\u0131n\u0131 \u015fi\u015firir. Bak\u0131m\u0131n\u0131 ve anla\u015f\u0131lmas\u0131n\u0131 zorla\u015ft\u0131r\u0131r.<\/li>\n<li><strong>Tek Sorumluluk Prensibinin \u0130hlali:<\/strong> Bir alt s\u0131n\u0131f, hem kendi temel i\u015flevselli\u011fini hem de miras ald\u0131\u011f\u0131 ek sorumluluklar\u0131 ta\u015f\u0131r. Bu, alt s\u0131n\u0131f\u0131n birden fazla sorumlulu\u011fa sahip olmas\u0131na neden olabilir ve Tek Sorumluluk Prensibi&#8217;ni (Single Responsibility Principle &#8211; SRP) ihlal eder.<\/li>\n<li><strong>Esneklik Eksikli\u011fi:<\/strong> Yeni bir \u00f6zellik eklendi\u011finde veya mevcut bir \u00f6zellik kald\u0131r\u0131ld\u0131\u011f\u0131nda, genellikle t\u00fcm miras hiyerar\u015fisini g\u00f6zden ge\u00e7irmeniz ve potansiyel olarak de\u011fi\u015ftirmeniz gerekir. Bu, sistemin geni\u015fletilebilirli\u011fini ve bak\u0131m\u0131n\u0131 olumsuz etkiler.<\/li>\n<\/ul>\n<h3>\u00d6rnek Senaryo: Kahve D\u00fckkan\u0131<\/h3>\n<p>Yukar\u0131daki s\u0131n\u0131rl\u0131l\u0131klar\u0131 daha iyi anlamak i\u00e7in bir kahve d\u00fckkan\u0131 otomasyon sistemi \u00f6rne\u011fini ele alal\u0131m. Temel olarak farkl\u0131 t\u00fcrde kahvelerimiz var (Espresso, Filtre Kahve vb.) ve bu kahvelere farkl\u0131 ekstralar (S\u00fct, \u015eeker, \u00c7ikolata) ekleyebiliyoruz. Her ekstran\u0131n hem maliyeti hem de tan\u0131m\u0131 vard\u0131r.<\/p>\n<h4>Basit Kahve S\u0131n\u0131f\u0131<\/h4>\n<p>\u0130lk yakla\u015f\u0131m olarak, temel bir <code>Kahve<\/code> soyut s\u0131n\u0131f\u0131 tan\u0131mlayabiliriz:<\/p>\n<pre><code class=\"language-java\">\n\/\/ Kahve.java\npublic abstract class Kahve {\n    protected String tanim;\n\n    public String getTanim() {\n        return tanim;\n    }\n\n    public abstract double maliyet();\n}\n\n\/\/ Espresso.java\npublic class Espresso extends Kahve {\n    public Espresso() {\n        tanim = \"Espresso\";\n    }\n\n    @Override\n    public double maliyet() {\n        return 5.0; \/\/ Espresso'nun temel maliyeti\n    }\n}\n\n\/\/ FiltreKahve.java\npublic class FiltreKahve extends Kahve {\n    public FiltreKahve() {\n        tanim = \"Filtre Kahve\";\n    }\n\n    @Override\n    public double maliyet() {\n        return 7.0; \/\/ Filtre Kahve'nin temel maliyeti\n    }\n}\n<\/code><\/pre>\n<h4>Maliyet ve Tan\u0131m Ekleme Zorlu\u011fu<\/h4>\n<p>\u015eimdi bu kahvelere &#8220;S\u00fct&#8221;, &#8220;\u015eeker&#8221; veya &#8220;\u00c7ikolata&#8221; gibi ekstralar eklemek istedi\u011fimizi d\u00fc\u015f\u00fcnelim. Miras yoluyla bu ekstralar\u0131 eklemeye kalkarsak:<\/p>\n<ul>\n<li><code>SutluEspresso<\/code> s\u0131n\u0131f\u0131 <code>Espresso<\/code>&#8216;dan miras alacak ve maliyetine s\u00fct maliyetini ekleyecek, tan\u0131m\u0131na &#8220;S\u00fctl\u00fc&#8221; ekleyecek.<\/li>\n<li><code>SekerliFiltreKahve<\/code> s\u0131n\u0131f\u0131 <code>FiltreKahve<\/code>&#8216;den miras alacak ve maliyetine \u015feker maliyetini ekleyecek, tan\u0131m\u0131na &#8220;\u015eekerli&#8221; ekleyecek.<\/li>\n<\/ul>\n<p>Peki ya &#8220;S\u00fctl\u00fc \u015eekerli Espresso&#8221; veya &#8220;S\u00fctl\u00fc \u00c7ikolatal\u0131 Filtre Kahve&#8221; gibi kombinasyonlar? Her olas\u0131 kombinasyon i\u00e7in yeni bir s\u0131n\u0131f olu\u015fturmam\u0131z gerekecekti:<\/p>\n<ul>\n<li><code>SutluEspresso<\/code><\/li>\n<li><code>SekerliEspresso<\/code><\/li>\n<li><code>CikolataliEspresso<\/code><\/li>\n<li><code>SutluSekerliEspresso<\/code><\/li>\n<li><code>SutluCikolataliEspresso<\/code><\/li>\n<li><code>SekerliCikolataliEspresso<\/code><\/li>\n<li><code>SutluSekerliCikolataliEspresso<\/code><\/li>\n<li>&#8230; ve ayn\u0131lar\u0131 <code>FiltreKahve<\/code> i\u00e7in.<\/li>\n<\/ul>\n<p>Bu, sadece 2 temel kahve ve 3 ekstra ile 2 * (2^3) = 16 farkl\u0131 s\u0131n\u0131f anlam\u0131na gelir. Yeni bir kahve t\u00fcr\u00fc veya yeni bir ekstra eklendi\u011finde bu say\u0131 katlanarak artar. Bu durum, kodun hem karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 art\u0131r\u0131r hem de bak\u0131m\u0131n\u0131 imkans\u0131z hale getirir. \u0130\u015fte bu noktada Decorator deseni devreye girerek bu sorunu zarif bir \u015fekilde \u00e7\u00f6zer.<\/p>\n<h2>Decorator Deseni&#8217;nin Yap\u0131s\u0131<\/h2>\n<p>Decorator deseni, bir dizi nesneyi birbirine sararak (wrap ederek) dinamik olarak yeni i\u015flevsellikler eklemeye odaklan\u0131r. Bu deseni anlamak i\u00e7in temel bile\u015fenlerini ve aralar\u0131ndaki ili\u015fkileri bilmek \u00f6nemlidir.<\/p>\n<h3>UML Diyagram\u0131 (A\u00e7\u0131klamal\u0131)<\/h3>\n<p>Decorator deseninin temel yap\u0131s\u0131n\u0131 a\u015fa\u011f\u0131daki UML diyagram\u0131 ile a\u00e7\u0131klayabiliriz (metinsel g\u00f6sterim):<\/p>\n<pre><code>\n+-------------------+\n|     <<interface>> |\n|     Component     |\n+-------------------+\n| + operation()     |\n+-------------------+\n          ^\n          |\n+-------------------+      +-------------------+\n| ConcreteComponent |      |     Decorator     |\n+-------------------+      +-------------------+\n| + operation()     |------| - component: Component |\n+-------------------+      | + operation()     |\n                           +-------------------+\n                                     ^\n                                     |\n                                     |\n                          +-------------------+\n                          | ConcreteDecorator |\n                          +-------------------+\n                          | + operation()     |\n                          +-------------------+\n<\/code><\/pre>\n<p>Bu diyagramdaki her bir bile\u015feni detayland\u0131ral\u0131m:<\/p>\n<h4>Component (Bile\u015fen)<\/h4>\n<ul>\n<li>Decorator desenindeki t\u00fcm nesnelerin ortak aray\u00fcz\u00fcn\u00fc tan\u0131mlayan soyut bir s\u0131n\u0131f veya aray\u00fczd\u00fcr.<\/li>\n<li>Hem somut bile\u015fenler (ConcreteComponent) hem de dekorat\u00f6rler (Decorator) bu aray\u00fcz\u00fc uygular. Bu, istemci kodunun, sarmalanm\u0131\u015f nesne ile dekorat\u00f6r aras\u0131nda bir fark g\u00f6rmeden \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<\/li>\n<li>\u00d6rne\u011fimizde: <code>Kahve<\/code> aray\u00fcz\u00fc.<\/li>\n<\/ul>\n<h4>ConcreteComponent (Somut Bile\u015fen)<\/h4>\n<ul>\n<li>Component aray\u00fcz\u00fcn\u00fc uygulayan ve temel i\u015flevselli\u011fi sa\u011flayan orijinal nesnedir.<\/li>\n<li>Bu, dekorat\u00f6rler taraf\u0131ndan sar\u0131lacak olan nesnedir.<\/li>\n<li>\u00d6rne\u011fimizde: <code>Espresso<\/code>, <code>FiltreKahve<\/code> gibi s\u0131n\u0131flar.<\/li>\n<\/ul>\n<h4>Decorator (Dekorat\u00f6r)<\/h4>\n<ul>\n<li>Component aray\u00fcz\u00fcn\u00fc uygulayan soyut bir s\u0131n\u0131ft\u0131r.<\/li>\n<li>\u0130\u00e7inde, saraca\u011f\u0131 <code>Component<\/code> t\u00fcr\u00fcndeki nesneye bir referans tutar. Bu referans, dekorat\u00f6r\u00fcn sarmalanm\u0131\u015f nesnenin i\u015flevselli\u011fine eri\u015fmesini sa\u011flar.<\/li>\n<li><code>Component<\/code> aray\u00fcz\u00fcndeki operasyonlar\u0131 uygular, ancak genellikle bu operasyonlar\u0131 sarmalanm\u0131\u015f <code>Component<\/code> nesnesine delege eder. Bu sayede, dekorat\u00f6rler kendi ek i\u015flevselliklerini eklemeden \u00f6nce veya sonra sarmalanm\u0131\u015f nesnenin davran\u0131\u015f\u0131n\u0131 \u00e7a\u011f\u0131rabilir.<\/li>\n<li>\u00d6rne\u011fimizde: <code>KahveDekorator<\/code> soyut s\u0131n\u0131f\u0131.<\/li>\n<\/ul>\n<h4>ConcreteDecorator (Somut Dekorat\u00f6r)<\/h4>\n<ul>\n<li>Decorator soyut s\u0131n\u0131f\u0131n\u0131 geni\u015fleten ve Component aray\u00fcz\u00fcn\u00fc uygulayan somut s\u0131n\u0131flard\u0131r.<\/li>\n<li>Her bir somut dekorat\u00f6r, temel Component nesnesine ek bir sorumluluk veya i\u015flevsellik ekler.<\/li>\n<li>Kendi <code>operation()<\/code> metodunu uygularken, genellikle sarmalanm\u0131\u015f Component nesnesinin <code>operation()<\/code> metodunu \u00e7a\u011f\u0131r\u0131r ve \u00fczerine kendi ek davran\u0131\u015f\u0131n\u0131 (\u00f6rne\u011fin, maliyeti art\u0131rma, tan\u0131m\u0131 de\u011fi\u015ftirme) ekler.<\/li>\n<li>\u00d6rne\u011fimizde: <code>Sut<\/code>, <code>Seker<\/code>, <code>Cikolata<\/code> gibi s\u0131n\u0131flar.<\/li>\n<\/ul>\n<p>Bu yap\u0131 sayesinde, bir <code>ConcreteComponent<\/code> nesnesini birden fazla <code>ConcreteDecorator<\/code> ile sarmalayabiliriz. Her bir dekorat\u00f6r, \u00f6nceki dekorat\u00f6r\u00fcn veya temel bile\u015fenin \u00fczerine kendi i\u015flevselli\u011fini ekleyerek, dinamik ve esnek bir \u015fekilde \u00f6zellik kombinasyonlar\u0131 olu\u015fturmam\u0131z\u0131 sa\u011flar.<\/p>\n<h2>Java&#8217;da Decorator Deseni Uygulamas\u0131<\/h2>\n<p>\u015eimdi kahve d\u00fckkan\u0131 \u00f6rne\u011fimizi Decorator deseni kullanarak Java&#8217;da nas\u0131l uygulayaca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m g\u00f6relim. Bu yakla\u015f\u0131m, miras\u0131n getirdi\u011fi &#8220;s\u0131n\u0131f patlamas\u0131&#8221; sorununu \u00e7\u00f6zecek ve yeni ekstralar\u0131n kolayca eklenmesini sa\u011flayacakt\u0131r.<\/p>\n<h3>\u00d6rnek Senaryo: Kahve D\u00fckkan\u0131 Devam\u0131<\/h3>\n<h4>Ad\u0131m 1: Component Aray\u00fcz\u00fc Tan\u0131mlama<\/h4>\n<p>T\u00fcm kahve t\u00fcrleri ve ekstralar\u0131n ortak davran\u0131\u015f\u0131 i\u00e7in bir aray\u00fcz tan\u0131ml\u0131yoruz. Bu, sistemdeki her bir bile\u015fenin (temel kahve veya dekorat\u00f6r) ayn\u0131 s\u00f6zle\u015fmeyi uygulamas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-java\">\n\/\/ Kahve.java\npublic interface Kahve {\n    String getTanim(); \/\/ Kahvenin veya ekstral\u0131 kahvenin tan\u0131m\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr\n    double maliyet();  \/\/ Kahvenin veya ekstral\u0131 kahvenin toplam maliyetini d\u00f6nd\u00fcr\u00fcr\n}\n<\/code><\/pre>\n<h4>Ad\u0131m 2: ConcreteComponent Uygulamalar\u0131<\/h4>\n<p>Temel kahve \u00e7e\u015fitlerimizi, <code>Kahve<\/code> aray\u00fcz\u00fcn\u00fc uygulayarak olu\u015fturuyoruz. Bunlar, dekorat\u00f6rler taraf\u0131ndan sar\u0131lacak olan orijinal nesnelerdir.<\/p>\n<pre><code class=\"language-java\">\n\/\/ Espresso.java\npublic class Espresso implements Kahve {\n    @Override\n    public String getTanim() {\n        return \"Espresso\";\n    }\n\n    @Override\n    public double maliyet() {\n        return 5.0; \/\/ Espresso'nun temel maliyeti\n    }\n}\n\n\/\/ FiltreKahve.java\npublic class FiltreKahve implements Kahve {\n    @Override\n    public String getTanim() {\n        return \"Filtre Kahve\";\n    }\n\n    @Override\n    public double maliyet() {\n        return 7.0; \/\/ Filtre Kahve'nin temel maliyeti\n    }\n}\n<\/code><\/pre>\n<h4>Ad\u0131m 3: Decorator Soyut S\u0131n\u0131f\u0131 Olu\u015fturma<\/h4>\n<p>T\u00fcm dekorat\u00f6rler i\u00e7in ortak bir soyut s\u0131n\u0131f olu\u015fturuyoruz. Bu s\u0131n\u0131f da <code>Kahve<\/code> aray\u00fcz\u00fcn\u00fc uygular ve sar\u0131lacak <code>Kahve<\/code> nesnesine bir referans tutar. Bu sayede, t\u00fcm dekorat\u00f6rler <code>Kahve<\/code> gibi davranabilir ve kendi ek i\u015flevselliklerini sarmalanm\u0131\u015f nesnenin \u00fczerine in\u015fa edebilirler.<\/p>\n<pre><code class=\"language-java\">\n\/\/ KahveDekorator.java\npublic abstract class KahveDekorator implements Kahve {\n    protected Kahve sarmalananKahve; \/\/ Sar\u0131lacak Kahve nesnesine referans\n\n    public KahveDekorator(Kahve kahve) {\n        this.sarmalananKahve = kahve;\n    }\n\n    \/\/ Bu metodlar soyut b\u0131rak\u0131l\u0131r veya varsay\u0131lan olarak sarmalanan kahveye delege edilir.\n    \/\/ ConcreteDecorator'lar bunlar\u0131 kendi mant\u0131klar\u0131yla uygular.\n    @Override\n    public abstract String getTanim();\n\n    @Override\n    public abstract double maliyet();\n}\n<\/code><\/pre>\n<h4>Ad\u0131m 4: ConcreteDecorator Uygulamalar\u0131<\/h4>\n<p>Her bir ekstra (S\u00fct, \u015eeker, \u00c7ikolata) i\u00e7in birer somut dekorat\u00f6r s\u0131n\u0131f\u0131 olu\u015fturuyoruz. Bu s\u0131n\u0131flar <code>KahveDekorator<\/code>&#8216;den miras al\u0131r ve kendi ek maliyetlerini ve tan\u0131mlar\u0131n\u0131 eklerler.<\/p>\n<pre><code class=\"language-java\">\n\/\/ Sut.java\npublic class Sut extends KahveDekorator {\n    public Sut(Kahve kahve) {\n        super(kahve);\n    }\n\n    @Override\n    public String getTanim() {\n        return sarmalananKahve.getTanim() + \", S\u00fctl\u00fc\";\n    }\n\n    @Override\n    public double maliyet() {\n        return sarmalananKahve.maliyet() + 2.0; \/\/ S\u00fct maliyeti\n    }\n}\n\n\/\/ Seker.java\npublic class Seker extends KahveDekorator {\n    public Seker(Kahve kahve) {\n        super(kahve);\n    }\n\n    @Override\n    public String getTanim() {\n        return sarmalananKahve.getTanim() + \", \u015eekerli\";\n    }\n\n    @Override\n    public double maliyet() {\n        return sarmalananKahve.maliyet() + 1.0; \/\/ \u015eeker maliyeti\n    }\n}\n\n\/\/ Cikolata.java\npublic class Cikolata extends KahveDekorator {\n    public Cikolata(Kahve kahve) {\n        super(kahve);\n    }\n\n    @Override\n    public String getTanim() {\n        return sarmalananKahve.getTanim() + \", \u00c7ikolatal\u0131\";\n    }\n\n    @Override\n    public double maliyet() {\n        return sarmalananKahve.maliyet() + 3.0; \/\/ \u00c7ikolata maliyeti\n    }\n}\n<\/code><\/pre>\n<h4>Ad\u0131m 5: Kullan\u0131m ve Test<\/h4>\n<p>\u015eimdi <code>Main<\/code> s\u0131n\u0131f\u0131m\u0131zda farkl\u0131 kahve kombinasyonlar\u0131 olu\u015fturarak Decorator deseninin esnekli\u011fini g\u00f6relim.<\/p>\n<pre><code class=\"language-java\">\n\/\/ Main.java\npublic class Main {\n    public static void main(String[] args) {\n        \/\/ Basit bir Espresso\n        Kahve espresso = new Espresso();\n        System.out.println(\"Sipari\u015f: \" + espresso.getTanim() + \", Maliyet: \" + espresso.maliyet() + \" TL\");\n        \/\/ \u00c7\u0131kt\u0131: Sipari\u015f: Espresso, Maliyet: 5.0 TL\n\n        \/\/ S\u00fctl\u00fc bir Espresso\n        Kahve sutluEspresso = new Sut(new Espresso());\n        System.out.println(\"Sipari\u015f: \" + sutluEspresso.getTanim() + \", Maliyet: \" + sutluEspresso.maliyet() + \" TL\");\n        \/\/ \u00c7\u0131kt\u0131: Sipari\u015f: Espresso, S\u00fctl\u00fc, Maliyet: 7.0 TL\n\n        \/\/ \u015eekerli bir Filtre Kahve\n        Kahve sekerliFiltreKahve = new Seker(new FiltreKahve());\n        System.out.println(\"Sipari\u015f: \" + sekerliFiltreKahve.getTanim() + \", Maliyet: \" + sekerliFiltreKahve.maliyet() + \" TL\");\n        \/\/ \u00c7\u0131kt\u0131: Sipari\u015f: Filtre Kahve, \u015eekerli, Maliyet: 8.0 TL\n\n        \/\/ S\u00fctl\u00fc ve \u00c7ikolatal\u0131 bir Espresso (birden fazla dekorat\u00f6r)\n        Kahve sutluCikolataliEspresso = new Cikolata(new Sut(new Espresso()));\n        System.out.println(\"Sipari\u015f: \" + sutluCikolataliEspresso.getTanim() + \", Maliyet: \" + sutluCikolataliEspresso.maliyet() + \" TL\");\n        \/\/ \u00c7\u0131kt\u0131: Sipari\u015f: Espresso, S\u00fctl\u00fc, \u00c7ikolatal\u0131, Maliyet: 10.0 TL\n\n        \/\/ \u015eekerli, S\u00fctl\u00fc ve \u00c7ikolatal\u0131 bir Filtre Kahve\n        Kahve kompleksFiltreKahve = new Cikolata(new Seker(new Sut(new FiltreKahve())));\n        System.out.println(\"Sipari\u015f: \" + kompleksFiltreKahve.getTanim() + \", Maliyet: \" + kompleksFiltreKahve.maliyet() + \" TL\");\n        \/\/ \u00c7\u0131kt\u0131: Sipari\u015f: Filtre Kahve, S\u00fctl\u00fc, \u015eekerli, \u00c7ikolatal\u0131, Maliyet: 13.0 TL\n    }\n}\n<\/code><\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, Decorator deseni sayesinde, temel kahve s\u0131n\u0131flar\u0131n\u0131 hi\u00e7 de\u011fi\u015ftirmeden, farkl\u0131 ekstralar\u0131 dinamik olarak ekleyebildik. Her yeni ekstra i\u00e7in sadece bir dekorat\u00f6r s\u0131n\u0131f\u0131 yazmak yeterli oldu, bu da kod tekrar\u0131n\u0131 azaltt\u0131 ve sistemin geni\u015fletilebilirli\u011fini art\u0131rd\u0131.<\/p>\n<h2>Decorator Deseni&#8217;nin Avantajlar\u0131<\/h2>\n<p>Decorator deseni, yaz\u0131l\u0131m tasar\u0131m\u0131nda bir dizi \u00f6nemli avantaj sunar ve bu da onu belirli senaryolarda olduk\u00e7a g\u00fc\u00e7l\u00fc bir ara\u00e7 haline getirir.<\/p>\n<h3>Esneklik<\/h3>\n<p>Decorator deseni, nesnelere \u00e7al\u0131\u015fma zaman\u0131nda dinamik olarak yeni sorumluluklar eklemenizi sa\u011flar. Miras\u0131n aksine, derleme zaman\u0131nda sabitlenmi\u015f bir hiyerar\u015fi olu\u015fturmazs\u0131n\u0131z. Bu, ayn\u0131 temel nesneye farkl\u0131 dekorat\u00f6r kombinasyonlar\u0131n\u0131 uygulayarak \u00e7ok \u00e7e\u015fitli davran\u0131\u015flar elde etmenizi m\u00fcmk\u00fcn k\u0131lar. \u00d6rne\u011fin, bir kahveye \u00f6nce s\u00fct, sonra \u015feker ekleyebilir veya tam tersini yapabilirsiniz; sonu\u00e7 ayn\u0131 olur (\u00e7o\u011fu durumda).<\/p>\n<h3>A\u00e7\u0131k\/Kapal\u0131 Prensibi (Open\/Closed Principle)<\/h3>\n<p>Bu desen, &#8220;A\u00e7\u0131k\/Kapal\u0131 Prensibi&#8221;ne (Open\/Closed Principle &#8211; OCP) m\u00fckemmel bir \u015fekilde uyar. OCP, yaz\u0131l\u0131m varl\u0131klar\u0131n\u0131n (s\u0131n\u0131flar, mod\u00fcller, fonksiyonlar vb.) geli\u015ftirmeye a\u00e7\u0131k, ancak de\u011fi\u015ftirmeye kapal\u0131 olmas\u0131 gerekti\u011fini belirtir. Decorator deseni ile yeni i\u015flevsellik eklemek istedi\u011finizde, mevcut temel s\u0131n\u0131flar\u0131 veya dekorat\u00f6rleri de\u011fi\u015ftirmenize gerek kalmaz. Sadece yeni bir <code>ConcreteDecorator<\/code> s\u0131n\u0131f\u0131 olu\u015fturarak mevcut sistemi geni\u015fletirsiniz. Bu, mevcut kodu bozma riskini azalt\u0131r ve sistemin daha kararl\u0131 olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>S\u0131n\u0131f Patlamas\u0131n\u0131 \u00d6nleme (Class Explosion)<\/h3>\n<p>Miras hiyerar\u015fileri, \u00f6zellikle \u00e7ok say\u0131da \u00f6zellik kombinasyonu oldu\u011funda, &#8220;s\u0131n\u0131f patlamas\u0131&#8221; sorununa yol a\u00e7abilir. Decorator deseni, her kombinasyon i\u00e7in ayr\u0131 bir s\u0131n\u0131f olu\u015fturmak yerine, temel nesneyi farkl\u0131 dekorat\u00f6rlerle sararak bu sorunu \u00e7\u00f6zer. Bu, kod taban\u0131n\u0131n \u00e7ok daha k\u00fc\u00e7\u00fck ve y\u00f6netilebilir kalmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Kod Tekrar\u0131n\u0131 Azaltma<\/h3>\n<p>Her bir ekstra \u00f6zelli\u011fi (\u00f6rne\u011fin, s\u00fct ekleme mant\u0131\u011f\u0131) ayr\u0131 bir dekorat\u00f6r s\u0131n\u0131f\u0131nda kaps\u00fcllendi\u011fi i\u00e7in, ayn\u0131 i\u015flevselli\u011fi farkl\u0131 alt s\u0131n\u0131flarda tekrar tekrar yazma ihtiyac\u0131 ortadan kalkar. Bu, kodun daha DRY (Don&#8217;t Repeat Yourself) olmas\u0131n\u0131 sa\u011flar ve bak\u0131m maliyetlerini d\u00fc\u015f\u00fcr\u00fcr.<\/p>\n<h3>Tek Sorumluluk Prensibi (Single Responsibility Principle)<\/h3>\n<p>Decorator deseni, Tek Sorumluluk Prensibi&#8217;ni (Single Responsibility Principle &#8211; SRP) destekler. Her bir <code>ConcreteDecorator<\/code> s\u0131n\u0131f\u0131, yaln\u0131zca belirli bir ek sorumlulu\u011fu (\u00f6rne\u011fin, s\u00fct ekleme, \u015feker ekleme) ele al\u0131r. Temel bile\u015fenler (ConcreteComponent) ise yaln\u0131zca kendi temel i\u015flevselliklerinden sorumludur. Bu, s\u0131n\u0131flar\u0131n daha odaklanm\u0131\u015f ve anla\u015f\u0131l\u0131r olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>Decorator Deseni&#8217;nin Dezavantajlar\u0131<\/h2>\n<p>Her tasar\u0131m deseni gibi, Decorator deseninin de belirli dezavantajlar\u0131 ve kullan\u0131m\u0131nda dikkat edilmesi gereken noktalar vard\u0131r.<\/p>\n<h3>Karma\u015f\u0131kl\u0131k<\/h3>\n<p>Basit bir nesneye tek bir sorumluluk eklemek istedi\u011finizde, Decorator deseni a\u015f\u0131r\u0131ya ka\u00e7an bir \u00e7\u00f6z\u00fcm olabilir. Birka\u00e7 dekorat\u00f6r\u00fcn \u00fcst \u00fcste bindirilmesi, nesne grafi\u011fini karma\u015f\u0131kla\u015ft\u0131rabilir ve \u00f6zellikle yeni ba\u015flayanlar i\u00e7in kodun anla\u015f\u0131lmas\u0131n\u0131 zorla\u015ft\u0131rabilir. Her bir dekorat\u00f6r\u00fcn sarmalanm\u0131\u015f nesneye referans tutmas\u0131 ve metot \u00e7a\u011fr\u0131lar\u0131n\u0131 delege etmesi, \u00e7a\u011fr\u0131 zincirini uzatabilir.<\/p>\n<h3>\u00c7ok Say\u0131da K\u00fc\u00e7\u00fck Nesne<\/h3>\n<p>Her bir ek \u00f6zellik i\u00e7in ayr\u0131 bir dekorat\u00f6r nesnesi olu\u015fturulmas\u0131 gerekti\u011finden, sistemde \u00e7ok say\u0131da k\u00fc\u00e7\u00fck nesne ortaya \u00e7\u0131kabilir. Bu durum, \u00f6zellikle performans\u0131n kritik oldu\u011fu veya bellek kullan\u0131m\u0131n\u0131n s\u0131k\u0131 bir \u015fekilde y\u00f6netilmesi gereken uygulamalarda ek y\u00fck getirebilir. Nesne olu\u015fturma maliyetleri ve \u00e7\u00f6p toplama (garbage collection) \u00fczerindeki etkileri g\u00f6z \u00f6n\u00fcnde bulundurulmal\u0131d\u0131r.<\/p>\n<h3>S\u0131ra Ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 (Nadiren)<\/h3>\n<p>\u00c7o\u011fu durumda, dekorat\u00f6rlerin uygulanma s\u0131ras\u0131 \u00f6nemli de\u011fildir (\u00f6rne\u011fin, s\u00fctl\u00fc \u015fekerli kahve ile \u015fekerli s\u00fctl\u00fc kahve ayn\u0131d\u0131r). Ancak, baz\u0131 \u00f6zel senaryolarda, dekorat\u00f6rlerin uygulama s\u0131ras\u0131, nihai davran\u0131\u015f \u00fczerinde farkl\u0131 bir etki yaratabilir. Bu durumda, istemci kodunun dekorat\u00f6rleri do\u011fru s\u0131rada uygulad\u0131\u011f\u0131ndan emin olmas\u0131 gerekir ki bu da hata yapma potansiyelini art\u0131rabilir.<\/p>\n<h3>Soyutlama Katmanlar\u0131<\/h3>\n<p>Dekorat\u00f6rler, temel bile\u015fenin i\u015flevselli\u011fini sarmalayarak bir soyutlama katman\u0131 ekler. Bu katman, baz\u0131 durumlarda temel nesnenin do\u011frudan eri\u015filmesi gereken \u00f6zel metotlar\u0131na eri\u015fimi zorla\u015ft\u0131rabilir. E\u011fer bir dekorat\u00f6r, sarmalanan nesnenin sadece <code>Component<\/code> aray\u00fcz\u00fcnde tan\u0131mlanmayan belirli bir metoduna ihtiya\u00e7 duyuyorsa, bu durumda tip d\u00f6n\u00fc\u015f\u00fcmleri (casting) veya daha karma\u015f\u0131k \u00e7\u00f6z\u00fcmler gerekebilir, bu da tasar\u0131m\u0131n zarafetini bozabilir.<\/p>\n<h2>Decorator Deseni Ne Zaman Kullan\u0131lmal\u0131?<\/h2>\n<p>Decorator deseni, belirli problem t\u00fcrleri i\u00e7in ideal bir \u00e7\u00f6z\u00fcm sunar. Do\u011fru ba\u011flamda kullan\u0131ld\u0131\u011f\u0131nda, yaz\u0131l\u0131m\u0131n esnekli\u011fini ve geni\u015fletilebilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir.<\/p>\n<h3>Dinamik Sorumluluk Ekleme<\/h3>\n<p>Bir nesneye \u00e7al\u0131\u015fma zaman\u0131nda dinamik olarak ek sorumluluklar veya davran\u0131\u015flar eklemek istedi\u011finizde Decorator deseni g\u00fc\u00e7l\u00fc bir se\u00e7enektir. \u00d6rne\u011fin, bir metin d\u00fczenleyici uygulamas\u0131nda, kullan\u0131c\u0131 bir metin blo\u011funa kal\u0131n, italik, alt\u0131 \u00e7izili gibi farkl\u0131 bi\u00e7imlendirme \u00f6zelliklerini uygulayabilir ve bu \u00f6zelliklerin kombinasyonlar\u0131 dinamik olarak de\u011fi\u015febilir. Her bir bi\u00e7imlendirme \u00f6zelli\u011fi bir dekorat\u00f6r olarak modellenebilir.<\/p>\n<h3>Miras\u0131n Yetersiz Kald\u0131\u011f\u0131 Durumlar<\/h3>\n<p>Miras hiyerar\u015fileri, statik \u00f6zellik ekleme i\u00e7in uygun olsa da, \u00e7ok say\u0131da olas\u0131 \u00f6zellik kombinasyonu oldu\u011funda veya \u00f6zelliklerin dinamik olarak eklenip \u00e7\u0131kar\u0131lmas\u0131 gerekti\u011finde yetersiz kal\u0131r. Bu t\u00fcr &#8220;s\u0131n\u0131f patlamas\u0131&#8221; senaryolar\u0131nda, Decorator deseni, her kombinasyon i\u00e7in ayr\u0131 bir s\u0131n\u0131f olu\u015fturma zorunlulu\u011funu ortadan kald\u0131rarak daha temiz ve y\u00f6netilebilir bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<h3>Aray\u00fcz ve Soyut S\u0131n\u0131f Kullan\u0131m\u0131<\/h3>\n<p>Decorator deseni, temel bile\u015fenin ve t\u00fcm dekorat\u00f6rlerin ortak bir aray\u00fcz\u00fc veya soyut s\u0131n\u0131f\u0131 uygulamas\u0131n\u0131 gerektirir. Bu sayede, istemci kodu, temel nesne ile dekore edilmi\u015f nesne aras\u0131nda ayr\u0131m yapmadan \u00e7al\u0131\u015fabilir. E\u011fer sisteminizde bu t\u00fcr bir ortak aray\u00fcz zaten mevcutsa veya kolayca tan\u0131mlanabiliyorsa, Decorator deseni iyi bir uyum sa\u011flayabilir.<\/p>\n<h3>A\u00e7\u0131k\/Kapal\u0131 Prensibi&#8217;ne Uyum<\/h3>\n<p>Mevcut s\u0131n\u0131flar\u0131 de\u011fi\u015ftirmeden yeni i\u015flevsellik eklemek istedi\u011finizde (yani, A\u00e7\u0131k\/Kapal\u0131 Prensibi&#8217;ne uymak istedi\u011finizde) Decorator deseni idealdir. Yeni bir \u00f6zellik veya davran\u0131\u015f eklendi\u011finde, sadece yeni bir <code>ConcreteDecorator<\/code> s\u0131n\u0131f\u0131 yaz\u0131l\u0131r ve mevcut s\u0131n\u0131flar dokunulmadan kal\u0131r. Bu, sistemin kararl\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r ve bak\u0131m maliyetlerini d\u00fc\u015f\u00fcr\u00fcr.<\/p>\n<h2>Di\u011fer Tasar\u0131m Desenleriyle Kar\u015f\u0131la\u015ft\u0131rma<\/h2>\n<p>Decorator deseni, di\u011fer baz\u0131 yap\u0131sal desenlerle benzerlikler g\u00f6sterebilir veya kar\u0131\u015ft\u0131r\u0131labilir. Aralar\u0131ndaki farklar\u0131 anlamak, do\u011fru deseni do\u011fru yerde kullanmak i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h3>Decorator vs. Adapter<\/h3>\n<ul>\n<li><strong>Decorator:<\/strong> Bir nesneye yeni sorumluluklar eklerken, o nesnenin aray\u00fcz\u00fcn\u00fc korur. Temel amac\u0131, mevcut i\u015flevselli\u011fi geni\u015fletmektir. &#8220;Benim gibi davran ama ek \u00f6zelliklerim var&#8221; der.<\/li>\n<li><strong>Adapter:<\/strong> Bir aray\u00fcz\u00fc, istemcinin bekledi\u011fi ba\u015fka bir aray\u00fcze d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. Temel amac\u0131, uyumsuz aray\u00fczlere sahip iki s\u0131n\u0131f\u0131n birlikte \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamakt\u0131r. &#8220;Benim gibi davran ama asl\u0131nda ba\u015fka bir \u015feyim&#8221; der.<\/li>\n<li><strong>\u00d6rnek:<\/strong> Bir kahveye s\u00fct eklemek Decorator&#8217;d\u0131r (hala bir kahvedir ama s\u00fctl\u00fcd\u00fcr). Eski bir yaz\u0131c\u0131y\u0131 yeni bir aray\u00fcze sahip bir bilgisayara ba\u011flamak i\u00e7in kullan\u0131lan bir adapt\u00f6r, Adapter desenidir.<\/li>\n<\/ul>\n<h3>Decorator vs. Proxy<\/h3>\n<ul>\n<li><strong>Decorator:<\/strong> Bir nesneye ek sorumluluklar katarak onun davran\u0131\u015f\u0131n\u0131 geni\u015fletir. \u0130stemciye her zaman ger\u00e7ek nesnenin i\u015flevselli\u011fini sunar, ancak bu i\u015flevselli\u011fi ek davran\u0131\u015flarla zenginle\u015ftirir.<\/li>\n<li><strong>Proxy:<\/strong> Bir nesnenin yerine ge\u00e7erek ona eri\u015fimi kontrol eder. Genellikle g\u00fcvenlik, uzaktan eri\u015fim, tembel y\u00fckleme (lazy loading) gibi nedenlerle kullan\u0131l\u0131r. Ayn\u0131 aray\u00fcze sahip olsa da, proxy nesnenin kendisi de\u011fildir, onun bir temsilcisidir ve davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirmekten ziyade eri\u015fimi y\u00f6netir.<\/li>\n<li><strong>\u00d6rnek:<\/strong> Bir kahveye \u00e7ikolata eklemek Decorator&#8217;d\u0131r. Bir veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131n a\u00e7\u0131l\u0131p kapanmas\u0131n\u0131 kontrol eden bir proxy (Proxy deseni) ise ba\u011flant\u0131y\u0131 temsil eder ama ba\u011flant\u0131n\u0131n kendisi de\u011fildir.<\/li>\n<\/ul>\n<h3>Decorator vs. Composite<\/h3>\n<ul>\n<li><strong>Decorator:<\/strong> Bir nesneyi sararak ona yeni davran\u0131\u015flar ekler. Odak noktas\u0131 tek bir nesnenin davran\u0131\u015f\u0131n\u0131 geni\u015fletmektir.<\/li>\n<li><strong>Composite:<\/strong> Tek tek nesneleri ve nesne gruplar\u0131n\u0131 ayn\u0131 \u015fekilde ele alabilmek i\u00e7in bir a\u011fa\u00e7 yap\u0131s\u0131 olu\u015fturur. Odak noktas\u0131, par\u00e7alar\u0131n ve b\u00fct\u00fcnlerin tekd\u00fcze i\u015flenmesidir.<\/li>\n<li><strong>Benzerlik:<\/strong> Her ikisi de bir Component aray\u00fcz\u00fcne sahiptir ve hem tekil nesneler hem de koleksiyonlar \u00fczerinde \u00e7al\u0131\u015fabilir. Ancak, Composite bir hiyerar\u015fi olu\u015ftururken, Decorator bir nesneyi &#8220;sarmalar&#8221;.<\/li>\n<\/ul>\n<h3>Decorator vs. Strategy<\/h3>\n<ul>\n<li><strong>Decorator:<\/strong> Bir nesnenin davran\u0131\u015f\u0131n\u0131 dinamik olarak geni\u015fletir. &#8220;Ne&#8221; yapt\u0131\u011f\u0131n\u0131 de\u011fi\u015ftirmez, &#8220;nas\u0131l&#8221; yapt\u0131\u011f\u0131n\u0131 veya ek olarak &#8220;ne&#8221; yapt\u0131\u011f\u0131n\u0131 de\u011fi\u015ftirir.<\/li>\n<li><strong>Strategy:<\/strong> Bir algoritma ailesini tan\u0131mlar, her algoritmay\u0131 ayr\u0131 bir s\u0131n\u0131fa kaps\u00fcller ve onlar\u0131 de\u011fi\u015ftirilebilir hale getirir. \u0130stemci, \u00e7al\u0131\u015fma zaman\u0131nda farkl\u0131 algoritmalar aras\u0131nda se\u00e7im yapabilir. &#8220;Ne&#8221; yap\u0131laca\u011f\u0131n\u0131 de\u011fi\u015ftirir.<\/li>\n<li><strong>\u00d6rnek:<\/strong> Bir kahveye s\u00fct eklemek Decorator&#8217;d\u0131r. Bir \u00f6deme sisteminde farkl\u0131 \u00f6deme y\u00f6ntemleri (kredi kart\u0131, PayPal vb.) aras\u0131nda ge\u00e7i\u015f yapmak Strategy desenidir.<\/li>\n<\/ul>\n<h2>Ger\u00e7ek D\u00fcnya Java \u00d6rnekleri<\/h2>\n<p>Decorator deseni, Java&#8217;n\u0131n kendi standart k\u00fct\u00fcphanelerinde yayg\u0131n olarak kullan\u0131lan ve g\u00fc\u00e7l\u00fc bir \u015fekilde uygulanan bir desendir. Bu, desenin pratik de\u011ferini ve esnekli\u011fini g\u00f6stermektedir.<\/p>\n<h3>Java I\/O K\u00fct\u00fcphanesi<\/h3>\n<p>Java&#8217;daki giri\u015f\/\u00e7\u0131k\u0131\u015f (I\/O) k\u00fct\u00fcphanesi, Decorator deseninin en bilinen ve en iyi \u00f6rneklerinden biridir. <code>java.io<\/code> paketindeki s\u0131n\u0131flar, verileri okuma ve yazma i\u015flevselli\u011fini farkl\u0131 \u015fekillerde geli\u015ftirmek i\u00e7in bu deseni kullan\u0131r.<\/p>\n<ul>\n<li><strong>Component:<\/strong> <code>InputStream<\/code>, <code>OutputStream<\/code>, <code>Reader<\/code>, <code>Writer<\/code> gibi soyut s\u0131n\u0131flar (veya aray\u00fczler gibi davrananlar).<\/li>\n<li><strong>ConcreteComponent:<\/strong> <code>FileInputStream<\/code>, <code>FileOutputStream<\/code>, <code>FileReader<\/code>, <code>FileWriter<\/code> gibi temel I\/O operasyonlar\u0131n\u0131 ger\u00e7ekle\u015ftiren s\u0131n\u0131flar. Bunlar, verilerin fiziksel bir kaynaktan (dosya gibi) okunmas\u0131n\u0131 veya yaz\u0131lmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong>Decorator:<\/strong> <code>FilterInputStream<\/code>, <code>FilterOutputStream<\/code>, <code>FilterReader<\/code>, <code>FilterWriter<\/code> gibi soyut s\u0131n\u0131flar. Bunlar, sarmalanan bir I\/O ak\u0131\u015f\u0131na referans tutar.<\/li>\n<li><strong>ConcreteDecorator:<\/strong> <code>BufferedInputStream<\/code>, <code>DataInputStream<\/code>, <code>GZIPInputStream<\/code>, <code>CipherInputStream<\/code> gibi s\u0131n\u0131flar.\n<ul>\n<li><code>BufferedInputStream<\/code>, sarmalanan <code>InputStream<\/code>&#8216;e tamponlama (buffering) \u00f6zelli\u011fi ekler, bu da okuma performans\u0131n\u0131 art\u0131r\u0131r.<\/li>\n<li><code>DataInputStream<\/code>, sarmalanan <code>InputStream<\/code>&#8216;e ilkel Java veri tiplerini (int, double, boolean vb.) okuma yetene\u011fi ekler.<\/li>\n<li><code>GZIPInputStream<\/code>, sarmalanan ak\u0131\u015ftan s\u0131k\u0131\u015ft\u0131r\u0131lm\u0131\u015f verileri (GZIP format\u0131nda) okuma yetene\u011fi ekler.<\/li>\n<li><code>CipherInputStream<\/code>, sarmalanan ak\u0131\u015ftan \u015fifrelenmi\u015f verileri okurken \u015fifresini \u00e7\u00f6zme yetene\u011fi ekler.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><strong>\u00d6rnek Kullan\u0131m:<\/strong><\/p>\n<pre><code class=\"language-java\">\nimport java.io.*;\n\npublic class IoDecoratorExample {\n    public static void main(String[] args) {\n        try {\n            \/\/ Temel bile\u015fen: Dosyadan okuma\n            InputStream fileInput = new FileInputStream(\"test.txt\");\n            System.out.println(\"Dosya okuma: \" + (char) fileInput.read()); \/\/ Tek karakter oku\n\n            \/\/ BufferedDecorator ekleme: Performans i\u00e7in tamponlama\n            InputStream bufferedInput = new BufferedInputStream(new FileInputStream(\"test.txt\"));\n            System.out.println(\"Tamponlu okuma: \" + (char) bufferedInput.read());\n\n            \/\/ DataDecorator ekleme: \u0130lkel veri tiplerini okuma\n            DataInputStream dataInput = new DataInputStream(\n                                        new BufferedInputStream(\n                                        new FileInputStream(\"test.txt\")));\n            \/\/ dataInput \u015fimdi hem tamponlama hem de ilkel veri okuma yetene\u011fine sahip.\n            \/\/ \u00d6rne\u011fin: dataInput.readInt();\n            System.out.println(\"Veri ak\u0131\u015f\u0131 okuma: \" + (char) dataInput.readByte());\n\n            fileInput.close();\n            bufferedInput.close();\n            dataInput.close();\n\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n    }\n}\n<\/code><\/pre>\n<p>Bu \u00f6rnekte, bir <code>FileInputStream<\/code> nesnesini <code>BufferedInputStream<\/code> ile sarmalayarak tamponlama \u00f6zelli\u011fini ekledik. Daha sonra bu tamponlanm\u0131\u015f ak\u0131\u015f\u0131 <code>DataInputStream<\/code> ile sarmalayarak ilkel veri tiplerini okuma yetene\u011fi kazand\u0131rd\u0131k. Her ad\u0131mda, mevcut ak\u0131\u015f\u0131n i\u015flevselli\u011fi geni\u015fletildi, ancak her nesne hala bir <code>InputStream<\/code> gibi davranabildi.<\/p>\n<h3>Java Swing<\/h3>\n<p>Java Swing GUI k\u00fct\u00fcphanesinde de Decorator desenine benzer yap\u0131lar g\u00f6r\u00fclebilir. \u00d6rne\u011fin, bir <code>JComponent<\/code> (\u00f6rne\u011fin <code>JTextArea<\/code> veya <code>JPanel<\/code>) etraf\u0131na <code>JScrollPane<\/code> eklemek, bile\u015fenin temel i\u015flevselli\u011fini de\u011fi\u015ftirmeden ona kayd\u0131rma (scrolling) yetene\u011fi ekler. <code>JScrollPane<\/code>, i\u00e7erdi\u011fi bile\u015feni sarmalar ve kayd\u0131rma \u00e7ubuklar\u0131 sa\u011flar.<\/p>\n<h3>Java Collections<\/h3>\n<p>Java Collections Framework&#8217;de do\u011frudan Decorator deseni olmasa da, <code>Collections<\/code> yard\u0131mc\u0131 s\u0131n\u0131f\u0131ndaki <code>unmodifiableList()<\/code>, <code>synchronizedList()<\/code> gibi metotlar, mevcut bir koleksiyonu sarmalayarak ona yeni davran\u0131\u015flar (de\u011fi\u015ftirilemezlik, senkronizasyon) kazand\u0131r\u0131r. Bu, Decorator deseninin ruhuna benzer bir kompozisyon yakla\u015f\u0131m\u0131d\u0131r.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Decorator tasar\u0131m deseni, nesne y\u00f6nelimli programlamada esnek ve geni\u015fletilebilir sistemler olu\u015fturmak i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Miras hiyerar\u015filerinin yol a\u00e7abilece\u011fi &#8220;s\u0131n\u0131f patlamas\u0131&#8221; sorununu \u00e7\u00f6zerek, mevcut nesnelere dinamik olarak yeni sorumluluklar eklemenin zarif bir yolunu sunar.<\/p>\n<p>Bu desenin temel faydalar\u0131 aras\u0131nda A\u00e7\u0131k\/Kapal\u0131 Prensibi&#8217;ne uyum, kod tekrar\u0131n\u0131n azalmas\u0131, Tek Sorumluluk Prensibi&#8217;nin desteklenmesi ve kod taban\u0131n\u0131n daha y\u00f6netilebilir kalmas\u0131 yer al\u0131r. Java I\/O k\u00fct\u00fcphanesi gibi ger\u00e7ek d\u00fcnya \u00f6rnekleri, Decorator deseninin pratik de\u011ferini ve yayg\u0131nl\u0131\u011f\u0131n\u0131 a\u00e7\u0131k\u00e7a g\u00f6stermektedir.<\/p>\n<p>Ancak, her tasar\u0131m deseni gibi Decorator&#8217;\u0131n da dezavantajlar\u0131 vard\u0131r. A\u015f\u0131r\u0131 kullan\u0131m, kodun karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 art\u0131rabilir ve \u00e7ok say\u0131da k\u00fc\u00e7\u00fck nesnenin olu\u015fmas\u0131na neden olabilir. Bu nedenle, deseni ne zaman kullanaca\u011f\u0131m\u0131za dair iyi bir anlay\u0131\u015fa sahip olmak, yaz\u0131l\u0131m mimarimizin sa\u011flaml\u0131\u011f\u0131n\u0131 ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini sa\u011flamak a\u00e7\u0131s\u0131ndan hayati \u00f6neme sahiptir.<\/p>\n<p>\u00d6zetle, bir nesnenin davran\u0131\u015f\u0131n\u0131 temel yap\u0131s\u0131n\u0131 de\u011fi\u015ftirmeden veya \u00e7ok say\u0131da alt s\u0131n\u0131f olu\u015fturmadan dinamik olarak geni\u015fletmeniz gerekti\u011finde, Decorator deseni d\u00fc\u015f\u00fcnmeniz gereken ilk \u00e7\u00f6z\u00fcmlerden biri olmal\u0131d\u0131r. Do\u011fru uyguland\u0131\u011f\u0131nda, daha mod\u00fcler, esnek ve bak\u0131m\u0131 kolay sistemler in\u015fa etmenize yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Decorator Tasar\u0131m Deseni: Java&#8217;da Esnek ve Geni\u015fletilebilir S\u0131n\u0131flar Olu\u015fturma\nGiri\u015f\nYaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, de\u011fi\u015fen gereksiniml","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-38180","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>Decorator Tasar\u0131m Deseni: Java&#039;da Esnek ve Geni\u015fletilebilir S\u0131n\u0131flar Olu\u015fturma - 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\/decorator-tasarim-deseni-javada-esnek-ve-genisletilebilir-siniflar-olusturma\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Decorator Tasar\u0131m Deseni: Java&#039;da Esnek ve Geni\u015fletilebilir S\u0131n\u0131flar Olu\u015fturma\" \/>\n<meta property=\"og:description\" content=\"Decorator Tasar\u0131m Deseni: Java&#039;da Esnek ve Geni\u015fletilebilir S\u0131n\u0131flar Olu\u015fturma Giri\u015f Yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, de\u011fi\u015fen gereksiniml\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/decorator-tasarim-deseni-javada-esnek-ve-genisletilebilir-siniflar-olusturma\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-25T04:40:52+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=\"22 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/decorator-tasarim-deseni-javada-esnek-ve-genisletilebilir-siniflar-olusturma\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/decorator-tasarim-deseni-javada-esnek-ve-genisletilebilir-siniflar-olusturma\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Decorator Tasar\u0131m Deseni: Java&#8217;da Esnek ve Geni\u015fletilebilir S\u0131n\u0131flar Olu\u015fturma\",\"datePublished\":\"2026-01-25T04:40:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/decorator-tasarim-deseni-javada-esnek-ve-genisletilebilir-siniflar-olusturma\/\"},\"wordCount\":3803,\"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\/decorator-tasarim-deseni-javada-esnek-ve-genisletilebilir-siniflar-olusturma\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/decorator-tasarim-deseni-javada-esnek-ve-genisletilebilir-siniflar-olusturma\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/decorator-tasarim-deseni-javada-esnek-ve-genisletilebilir-siniflar-olusturma\/\",\"name\":\"Decorator Tasar\u0131m Deseni: Java'da Esnek ve Geni\u015fletilebilir S\u0131n\u0131flar Olu\u015fturma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-25T04:40:52+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/decorator-tasarim-deseni-javada-esnek-ve-genisletilebilir-siniflar-olusturma\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/decorator-tasarim-deseni-javada-esnek-ve-genisletilebilir-siniflar-olusturma\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/decorator-tasarim-deseni-javada-esnek-ve-genisletilebilir-siniflar-olusturma\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Decorator Tasar\u0131m Deseni: Java&#8217;da Esnek ve Geni\u015fletilebilir S\u0131n\u0131flar Olu\u015fturma\"}]},{\"@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":"Decorator Tasar\u0131m Deseni: Java'da Esnek ve Geni\u015fletilebilir S\u0131n\u0131flar Olu\u015fturma - 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\/decorator-tasarim-deseni-javada-esnek-ve-genisletilebilir-siniflar-olusturma\/","og_locale":"tr_TR","og_type":"article","og_title":"Decorator Tasar\u0131m Deseni: Java'da Esnek ve Geni\u015fletilebilir S\u0131n\u0131flar Olu\u015fturma","og_description":"Decorator Tasar\u0131m Deseni: Java'da Esnek ve Geni\u015fletilebilir S\u0131n\u0131flar Olu\u015fturma Giri\u015f Yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, de\u011fi\u015fen gereksiniml","og_url":"https:\/\/fatihsoysal.com\/blog\/decorator-tasarim-deseni-javada-esnek-ve-genisletilebilir-siniflar-olusturma\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-25T04:40:52+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"22 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/decorator-tasarim-deseni-javada-esnek-ve-genisletilebilir-siniflar-olusturma\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/decorator-tasarim-deseni-javada-esnek-ve-genisletilebilir-siniflar-olusturma\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Decorator Tasar\u0131m Deseni: Java&#8217;da Esnek ve Geni\u015fletilebilir S\u0131n\u0131flar Olu\u015fturma","datePublished":"2026-01-25T04:40:52+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/decorator-tasarim-deseni-javada-esnek-ve-genisletilebilir-siniflar-olusturma\/"},"wordCount":3803,"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\/decorator-tasarim-deseni-javada-esnek-ve-genisletilebilir-siniflar-olusturma\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/decorator-tasarim-deseni-javada-esnek-ve-genisletilebilir-siniflar-olusturma\/","url":"https:\/\/fatihsoysal.com\/blog\/decorator-tasarim-deseni-javada-esnek-ve-genisletilebilir-siniflar-olusturma\/","name":"Decorator Tasar\u0131m Deseni: Java'da Esnek ve Geni\u015fletilebilir S\u0131n\u0131flar Olu\u015fturma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-25T04:40:52+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/decorator-tasarim-deseni-javada-esnek-ve-genisletilebilir-siniflar-olusturma\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/decorator-tasarim-deseni-javada-esnek-ve-genisletilebilir-siniflar-olusturma\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/decorator-tasarim-deseni-javada-esnek-ve-genisletilebilir-siniflar-olusturma\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Decorator Tasar\u0131m Deseni: Java&#8217;da Esnek ve Geni\u015fletilebilir S\u0131n\u0131flar Olu\u015fturma"}]},{"@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\/38180","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=38180"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38180\/revisions"}],"predecessor-version":[{"id":38181,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38180\/revisions\/38181"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=38180"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=38180"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=38180"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}