[{"data":1,"prerenderedAt":1964},["ShallowReactive",2],{"post-\u002Ftr\u002Fcomposite-tasarim-deseni-nedir":3},{"page":4,"translation":1814,"nav":1828,"related":1944,"random":1954},{"id":5,"title":6,"body":7,"categories":1812,"category":1814,"date":1815,"description":1816,"draft":1817,"extension":1818,"image":1819,"kind":1814,"lang":455,"meta":1820,"navigation":226,"path":1727,"readingTime":242,"seo":1821,"slug":1822,"stem":1823,"tags":1824,"translationKey":1814,"type":1813,"updated":1814,"__hash__":1827},"postsTr\u002Ftr\u002Fcomposite-tasarim-deseni-nedir.md","Composite Tasarım Deseni Nedir?",{"type":8,"value":9,"toc":1792},"minimark",[10,20,33,36,86,89,94,99,101,105,108,119,122,129,132,134,138,151,154,171,174,180,183,185,189,192,442,444,448,510,512,516,530,532,536,565,567,571,576,1143,1147,1555,1557,1561,1576,1583,1617,1621,1641,1645,1677,1679,1683,1688,1710,1715,1743,1748,1788],[11,12,13,14,19],"p",{},"Bu yazı ",[15,16,18],"a",{"href":17},"\u002Ftr\u002Fdesign-patterns-tasarim-desenleri-nedir","Design Patterns\u002FTasarım Desenleri Nedir?"," başlıklı yazı dizisinin bir parçasıdır.",[11,21,22,23,32],{},"Bu içerik ağırlıklı olarak ",[15,24,31],{"href":25,"rel":26,"target":30},"https:\u002F\u002Frefactoring.guru\u002Fdesign-patterns",[27,28,29],"nofollow","noopener","noreferrer","_blank","refactoring.guru"," sitesindeki içeriğin tercümesi ve derlenmesinden oluşturulmuştur.",[11,34,35],{},"Tüm tasarım desenleri ya da diğer adıyla tasarım kalıplarına yönelik ayrıntılı içeriklere yazının sonundaki bağlantılardan ulaşabilirsiniz.",[37,38,39,46],"blockquote",{},[11,40,41,42],{},"💡 ",[43,44,45],"strong",{},"Özet (TL;DR):",[47,48,49,56,75],"ul",{},[50,51,52,55],"li",{},[43,53,54],{},"Amaç:"," Nesneleri ağaç yapıları (part-whole hierarchies) şeklinde gruplamayı sağlar. Hem tekil nesneleri (yapraklar) hem de nesne gruplarını (dallar\u002Fcomposite) aynı ortak arayüz üzerinden tek bir nesneymiş gibi yönetebilmenize olanak tanır.",[50,57,58,61,62,66,67,70,71,74],{},[43,59,60],{},"Kilit Yapılar:"," Ortak Bileşen Arayüzü (",[63,64,65],"code",{},"Component","), Tekil Nesne (",[63,68,69],{},"Leaf",") ve Bileşik Nesne (",[63,72,73],{},"Composite",").",[50,76,77,80,81,85],{},[43,78,79],{},"Motto:"," ",[82,83,84],"em",{},"Treat individual and composite objects uniformly"," (Tekil nesnelerle grup nesnelerini aynı şekilde ele al).",[87,88],"hr",{},[90,91,93],"h2",{"id":92},"composite-tasarım-deseninin-amacı","Composite Tasarım Deseninin Amacı",[11,95,96,98],{},[43,97,73],{}," (Kompozit \u002F Bileşik), nesneleri ağaç yapıları halinde oluşturmanıza ve bu ağacın dalları ile tek tek nesnelermiş gibi çalışmanıza olanak veren yapısal (structural) bir tasarım desenidir.",[87,100],{},[90,102,104],{"id":103},"sorun","Sorun",[11,106,107],{},"Uygulamanızın veri modeli hiyerarşik bir ağaç şeklinde gösterilebiliyorsa Composite deseni çok işe yarar.",[11,109,110,111,114,115,118],{},"Örneğin, ",[63,112,113],{},"Products"," (Ürünler) ve ",[63,116,117],{},"Boxes"," (Kutular) şeklinde iki nesnemiz olduğunu düşünelim. Bir kutu birden fazla ürün içerebileceği gibi, daha küçük kutuları da barındırabilir. Bu küçük kutuların içinden de ürünler veya başka kutular çıkabilir (bu böyle devam eder).",[11,120,121],{},"Siparişlerin toplam fiyatını hesaplayan bir sistem tasarlayacağınızı varsayalım. Sipariş sadece basit ürünlerden oluşabileceği gibi, içi farklı ürünler ve kutularla dolu devasa bir kutudan da oluşabilir. Böyle bir hiyerarşide toplam fiyatı nasıl hesaplarsınız?",[11,123,124],{},[125,126],"img",{"alt":127,"src":128},"Composite Tasarım Deseni","\u002Fimages\u002Fcomposite-tasarim-deseni-nedir\u002Fcomposite-design-pattern-sorunu-tr.avif",[11,130,131],{},"Klasik yöntemle tüm kutuları döngülerle açıp ürünleri tek tek bulmaya çalışabilirsiniz. Ancak kod seviyesinde bu o kadar kolay değildir. Çünkü kaç katman alta ineceğinizi, hangi kutunun içinde ne tür nesneler olduğunu önceden bilmeniz gerekir. Bu durum kodu karmaşıklaştırır ve bakımı imkansız hale getirir.",[87,133],{},[90,135,137],{"id":136},"çözüm","Çözüm",[11,139,140,143,144,147,148,150],{},[43,141,142],{},"Composite deseni",", ürünler ve kutularla çalışırken fiyat hesaplaması için ortak bir arayüz (örneğin ",[63,145,146],{},"getPrice()"," metodu içeren ",[63,149,65],{}," sınıfı) kullanılmasını önerir.",[11,152,153],{},"Peki bu metot nasıl çalışır?",[47,155,156,162],{},[50,157,158,161],{},[43,159,160],{},"Ürün (Leaf):"," Basitçe kendi fiyatını döndürür.",[50,163,164,167,168,170],{},[43,165,166],{},"Kutu (Composite):"," Kendi içindeki tüm öğeleri (dosya, ürün veya diğer kutular) tarar, her birine ",[63,169,146],{}," metodunu çağırır ve gelen değerleri toplayıp sonucu üst katmana döndürür.",[11,172,173],{},"Eğer alt öğelerden biri de bir kutuysa, o da kendi altındakileri toplayacaktır. Böylece en üstteki kutu, alt katmanların detaylarını hiç bilmeden tek bir metot çağrısıyla toplam fiyatı öğrenmiş olur.",[11,175,176],{},[125,177],{"alt":178,"src":179},"Kompozit tasarım deseni nedir?","\u002Fimages\u002Fcomposite-tasarim-deseni-nedir\u002Fcomposite-tasarim-deseni-karikatur-1-tr.avif",[11,181,182],{},"İstemci kodun nesnelerin somut tiplerini (basit ürün mü yoksa kutu mu olduğunu) bilmesine gerek kalmaz. Hepsiyle aynı ortak arayüz üzerinden çalışabilir.",[87,184],{},[90,186,188],{"id":187},"gerçek-hayat-senaryosu-dosya-ve-klasör-hiyerarşisi-file-system","Gerçek Hayat Senaryosu: Dosya ve Klasör Hiyerarşisi (File System)",[11,190,191],{},"Dosya sistemlerindeki klasörler ve dosyalar Composite deseninin en net örneğidir. Klasörler içinde dosyalar barındırabilirken, dosyalar alt eleman içeremez:",[193,194,199],"pre",{"className":195,"code":196,"language":197,"meta":198,"style":198},"language-php shiki shiki-themes github-light github-dark","\u002F\u002F 1. Ortak Arayüz (Component)\nabstract class FileSystemItem {\n    protected string $name;\n\n    public function __construct(string $name) {\n        $this->name = $name;\n    }\n\n    abstract public function getSize(): int;\n}\n\n\u002F\u002F 2. Yaprak Nesne (Leaf)\nclass File extends FileSystemItem {\n    private int $size;\n\n    public function __construct(string $name, int $size) {\n        parent::__construct($name);\n        $this->size = $size;\n    }\n\n    public function getSize(): int {\n        return $this->size;\n    }\n}\n\n\u002F\u002F 3. Bileşik Nesne (Composite)\nclass Directory extends FileSystemItem {\n    private array $items = [];\n\n    public function add(FileSystemItem $item): void {\n        $this->items[] = $item;\n    }\n\n    public function getSize(): int {\n        $totalSize = 0;\n        foreach ($this->items as $item) {\n            \u002F\u002F Özyinelemeli (recursive) olarak tüm boyutlar toplanıyor\n            $totalSize += $item->getSize();\n        }\n        return $totalSize;\n    }\n}\n","php","",[63,200,201,209,215,221,228,234,240,246,251,257,263,268,274,280,286,291,297,303,309,314,319,325,331,336,341,346,352,358,364,369,375,381,386,391,396,402,408,414,420,426,432,437],{"__ignoreMap":198},[202,203,206],"span",{"class":204,"line":205},"line",1,[202,207,208],{},"\u002F\u002F 1. Ortak Arayüz (Component)\n",[202,210,212],{"class":204,"line":211},2,[202,213,214],{},"abstract class FileSystemItem {\n",[202,216,218],{"class":204,"line":217},3,[202,219,220],{},"    protected string $name;\n",[202,222,224],{"class":204,"line":223},4,[202,225,227],{"emptyLinePlaceholder":226},true,"\n",[202,229,231],{"class":204,"line":230},5,[202,232,233],{},"    public function __construct(string $name) {\n",[202,235,237],{"class":204,"line":236},6,[202,238,239],{},"        $this->name = $name;\n",[202,241,243],{"class":204,"line":242},7,[202,244,245],{},"    }\n",[202,247,249],{"class":204,"line":248},8,[202,250,227],{"emptyLinePlaceholder":226},[202,252,254],{"class":204,"line":253},9,[202,255,256],{},"    abstract public function getSize(): int;\n",[202,258,260],{"class":204,"line":259},10,[202,261,262],{},"}\n",[202,264,266],{"class":204,"line":265},11,[202,267,227],{"emptyLinePlaceholder":226},[202,269,271],{"class":204,"line":270},12,[202,272,273],{},"\u002F\u002F 2. Yaprak Nesne (Leaf)\n",[202,275,277],{"class":204,"line":276},13,[202,278,279],{},"class File extends FileSystemItem {\n",[202,281,283],{"class":204,"line":282},14,[202,284,285],{},"    private int $size;\n",[202,287,289],{"class":204,"line":288},15,[202,290,227],{"emptyLinePlaceholder":226},[202,292,294],{"class":204,"line":293},16,[202,295,296],{},"    public function __construct(string $name, int $size) {\n",[202,298,300],{"class":204,"line":299},17,[202,301,302],{},"        parent::__construct($name);\n",[202,304,306],{"class":204,"line":305},18,[202,307,308],{},"        $this->size = $size;\n",[202,310,312],{"class":204,"line":311},19,[202,313,245],{},[202,315,317],{"class":204,"line":316},20,[202,318,227],{"emptyLinePlaceholder":226},[202,320,322],{"class":204,"line":321},21,[202,323,324],{},"    public function getSize(): int {\n",[202,326,328],{"class":204,"line":327},22,[202,329,330],{},"        return $this->size;\n",[202,332,334],{"class":204,"line":333},23,[202,335,245],{},[202,337,339],{"class":204,"line":338},24,[202,340,262],{},[202,342,344],{"class":204,"line":343},25,[202,345,227],{"emptyLinePlaceholder":226},[202,347,349],{"class":204,"line":348},26,[202,350,351],{},"\u002F\u002F 3. Bileşik Nesne (Composite)\n",[202,353,355],{"class":204,"line":354},27,[202,356,357],{},"class Directory extends FileSystemItem {\n",[202,359,361],{"class":204,"line":360},28,[202,362,363],{},"    private array $items = [];\n",[202,365,367],{"class":204,"line":366},29,[202,368,227],{"emptyLinePlaceholder":226},[202,370,372],{"class":204,"line":371},30,[202,373,374],{},"    public function add(FileSystemItem $item): void {\n",[202,376,378],{"class":204,"line":377},31,[202,379,380],{},"        $this->items[] = $item;\n",[202,382,384],{"class":204,"line":383},32,[202,385,245],{},[202,387,389],{"class":204,"line":388},33,[202,390,227],{"emptyLinePlaceholder":226},[202,392,394],{"class":204,"line":393},34,[202,395,324],{},[202,397,399],{"class":204,"line":398},35,[202,400,401],{},"        $totalSize = 0;\n",[202,403,405],{"class":204,"line":404},36,[202,406,407],{},"        foreach ($this->items as $item) {\n",[202,409,411],{"class":204,"line":410},37,[202,412,413],{},"            \u002F\u002F Özyinelemeli (recursive) olarak tüm boyutlar toplanıyor\n",[202,415,417],{"class":204,"line":416},38,[202,418,419],{},"            $totalSize += $item->getSize();\n",[202,421,423],{"class":204,"line":422},39,[202,424,425],{},"        }\n",[202,427,429],{"class":204,"line":428},40,[202,430,431],{},"        return $totalSize;\n",[202,433,435],{"class":204,"line":434},41,[202,436,245],{},[202,438,440],{"class":204,"line":439},42,[202,441,262],{},[87,443],{},[90,445,447],{"id":446},"composite-vs-decorator-vs-chain-of-responsibility","Composite vs Decorator vs Chain of Responsibility",[449,450,451,468],"table",{},[452,453,454],"thead",{},[455,456,457,462,465],"tr",{},[458,459,461],"th",{"align":460},"left","Desen",[458,463,464],{"align":460},"Alt Nesne Yapısı",[458,466,467],{"align":460},"İstek\u002Fİşlem Akışı",[469,470,471,484,497],"tbody",{},[455,472,473,478,481],{},[474,475,476],"td",{"align":460},[43,477,73],{},[474,479,480],{"align":460},"Çoklu (Ağaç yapısında yaprak ve dallar).",[474,482,483],{"align":460},"İşlemleri özyinelemeli (recursive) olarak tüm dallara dağıtır.",[455,485,486,491,494],{},[474,487,488],{"align":460},[43,489,490],{},"Decorator",[474,492,493],{"align":460},"Tekil (Sadece sarmalanan tek bir nesne).",[474,495,496],{"align":460},"Nesneye yeni özellikler ekler, akışı kesmez.",[455,498,499,504,507],{},[474,500,501],{"align":460},[43,502,503],{},"Chain of Responsibility",[474,505,506],{"align":460},"Tekil (Zincir şeklinde ardışık halkalar).",[474,508,509],{"align":460},"İsteği sırayla sonraki halkaya iletir, akış kesilebilir.",[87,511],{},[90,513,515],{"id":514},"uygulanabilirlik","Uygulanabilirlik",[47,517,518,524],{},[50,519,520,523],{},[43,521,522],{},"Hiyerarşik Ağaç Yapıları:"," Uygulamanızda dosya sistemleri, GUI menüleri veya organizasyon şemaları gibi ağaç benzeri bir nesne hiyerarşisi kurmanız gerektiğinde kullanın.",[50,525,526,529],{},[43,527,528],{},"Tek Tip Ele Alma (Uniformity):"," İstemci kodun hem tekil nesneleri (yaprak düğümleri) hem de bileşik nesneleri (dalları) ayırt etmeden, tamamen aynı şekilde değerlendirmesini istediğinizde kullanın.",[87,531],{},[90,533,535],{"id":534},"diğer-tasarım-desenleri-ile-i̇lişkisi","Diğer Tasarım Desenleri ile İlişkisi",[47,537,538,545,550,557],{},[50,539,540,541,544],{},"Kompleks Composite ağaçları oluştururken nesne inşa aşamalarını yönetmek için ",[43,542,543],{},"Builder"," deseninden faydalanabilirsiniz.",[50,546,547,549],{},[43,548,503],{}," deseni Composite ile birlikte sıkça kullanılır. Bir yaprak bileşen istek aldığında, isteği tüm üst dallar boyunca ağacın köküne kadar iletebilir.",[50,551,552,553,556],{},"Composite ağaç düğümlerini ziyaret etmek ve üzerlerinde işlemler gerçekleştirmek için ",[43,554,555],{},"Visitor"," deseni kullanılabilir.",[50,558,559,561,562,564],{},[43,560,490],{}," ve ",[43,563,73],{}," benzer yapılara sahiptir ancak Decorator sadece tek bir nesneyi sarmalayıp ona ek sorumluluk yüklerken, Composite altındaki nesnelerin sonuçlarını toplar.",[87,566],{},[90,568,570],{"id":569},"composite-tasarım-deseni-kod-örnekleri","Composite Tasarım Deseni Kod Örnekleri",[572,573,575],"h3",{"id":574},"örnek-php-kodu","Örnek PHP Kodu",[193,577,579],{"className":195,"code":578,"language":197,"meta":198,"style":198},"\u003C?php\n\nnamespace RefactoringGuru\\Composite\\Conceptual;\n\nabstract class Component\n{\n    protected ?Component $parent = null;\n\n    public function setParent(?Component $parent)\n    {\n        $this->parent = $parent;\n    }\n\n    public function getParent(): ?Component\n    {\n        return $this->parent;\n    }\n\n    public function add(Component $component): void { }\n\n    public function remove(Component $component): void { }\n\n    public function isComposite(): bool\n    {\n        return false;\n    }\n\n    abstract public function operation(): string;\n}\n\nclass Leaf extends Component\n{\n    public function operation(): string\n    {\n        return \"Leaf\";\n    }\n}\n\nclass Composite extends Component\n{\n    protected \\SplObjectStorage $children;\n\n    public function __construct()\n    {\n        $this->children = new \\SplObjectStorage();\n    }\n\n    public function add(Component $component): void\n    {\n        $this->children->attach($component);\n        $component->setParent($this);\n    }\n\n    public function remove(Component $component): void\n    {\n        $this->children->detach($component);\n        $component->setParent(null);\n    }\n\n    public function isComposite(): bool\n    {\n        return true;\n    }\n\n    public function operation(): string\n    {\n        $results = [];\n        foreach ($this->children as $child) {\n            $results[] = $child->operation();\n        }\n\n        return \"Branch(\" . implode(\"+\", $results) . \")\";\n    }\n}\n\nfunction clientCode(Component $component)\n{\n    echo \"RESULT: \" . $component->operation();\n}\n\n$simple = new Leaf();\necho \"Client: Basit bir bileşen çalıştırılıyor:\\n\";\nclientCode($simple);\necho \"\\n\\n\";\n\n$tree = new Composite();\n$branch1 = new Composite();\n$branch1->add(new Leaf());\n$branch1->add(new Leaf());\n\n$branch2 = new Composite();\n$branch2->add(new Leaf());\n\n$tree->add($branch1);\n$tree->add($branch2);\n\necho \"Client: Karmaşık bir kompozit ağaç çalıştırılıyor:\\n\";\nclientCode($tree);\necho \"\\n\\n\";\n\nfunction clientCode2(Component $component1, Component $component2)\n{\n    if ($component1->isComposite()) {\n        $component1->add($component2);\n    }\n    echo \"RESULT: \" . $component1->operation();\n}\n\necho \"Client: Sınıf kontrolü yapmadan ağaca yeni eleman ekleniyor:\\n\";\nclientCode2($tree, $simple);\n",[63,580,581,586,590,595,599,604,609,614,618,623,628,633,637,641,646,650,655,659,663,668,672,677,681,686,690,695,699,703,708,712,716,721,725,730,734,739,743,747,751,756,760,765,769,775,780,786,791,796,802,807,813,819,824,829,835,840,846,852,857,862,867,872,878,883,888,893,898,904,910,916,921,926,932,937,942,947,953,958,964,969,974,980,986,992,998,1003,1009,1015,1021,1026,1031,1037,1043,1048,1054,1060,1065,1071,1077,1082,1087,1093,1098,1104,1110,1115,1121,1126,1131,1137],{"__ignoreMap":198},[202,582,583],{"class":204,"line":205},[202,584,585],{},"\u003C?php\n",[202,587,588],{"class":204,"line":211},[202,589,227],{"emptyLinePlaceholder":226},[202,591,592],{"class":204,"line":217},[202,593,594],{},"namespace RefactoringGuru\\Composite\\Conceptual;\n",[202,596,597],{"class":204,"line":223},[202,598,227],{"emptyLinePlaceholder":226},[202,600,601],{"class":204,"line":230},[202,602,603],{},"abstract class Component\n",[202,605,606],{"class":204,"line":236},[202,607,608],{},"{\n",[202,610,611],{"class":204,"line":242},[202,612,613],{},"    protected ?Component $parent = null;\n",[202,615,616],{"class":204,"line":248},[202,617,227],{"emptyLinePlaceholder":226},[202,619,620],{"class":204,"line":253},[202,621,622],{},"    public function setParent(?Component $parent)\n",[202,624,625],{"class":204,"line":259},[202,626,627],{},"    {\n",[202,629,630],{"class":204,"line":265},[202,631,632],{},"        $this->parent = $parent;\n",[202,634,635],{"class":204,"line":270},[202,636,245],{},[202,638,639],{"class":204,"line":276},[202,640,227],{"emptyLinePlaceholder":226},[202,642,643],{"class":204,"line":282},[202,644,645],{},"    public function getParent(): ?Component\n",[202,647,648],{"class":204,"line":288},[202,649,627],{},[202,651,652],{"class":204,"line":293},[202,653,654],{},"        return $this->parent;\n",[202,656,657],{"class":204,"line":299},[202,658,245],{},[202,660,661],{"class":204,"line":305},[202,662,227],{"emptyLinePlaceholder":226},[202,664,665],{"class":204,"line":311},[202,666,667],{},"    public function add(Component $component): void { }\n",[202,669,670],{"class":204,"line":316},[202,671,227],{"emptyLinePlaceholder":226},[202,673,674],{"class":204,"line":321},[202,675,676],{},"    public function remove(Component $component): void { }\n",[202,678,679],{"class":204,"line":327},[202,680,227],{"emptyLinePlaceholder":226},[202,682,683],{"class":204,"line":333},[202,684,685],{},"    public function isComposite(): bool\n",[202,687,688],{"class":204,"line":338},[202,689,627],{},[202,691,692],{"class":204,"line":343},[202,693,694],{},"        return false;\n",[202,696,697],{"class":204,"line":348},[202,698,245],{},[202,700,701],{"class":204,"line":354},[202,702,227],{"emptyLinePlaceholder":226},[202,704,705],{"class":204,"line":360},[202,706,707],{},"    abstract public function operation(): string;\n",[202,709,710],{"class":204,"line":366},[202,711,262],{},[202,713,714],{"class":204,"line":371},[202,715,227],{"emptyLinePlaceholder":226},[202,717,718],{"class":204,"line":377},[202,719,720],{},"class Leaf extends Component\n",[202,722,723],{"class":204,"line":383},[202,724,608],{},[202,726,727],{"class":204,"line":388},[202,728,729],{},"    public function operation(): string\n",[202,731,732],{"class":204,"line":393},[202,733,627],{},[202,735,736],{"class":204,"line":398},[202,737,738],{},"        return \"Leaf\";\n",[202,740,741],{"class":204,"line":404},[202,742,245],{},[202,744,745],{"class":204,"line":410},[202,746,262],{},[202,748,749],{"class":204,"line":416},[202,750,227],{"emptyLinePlaceholder":226},[202,752,753],{"class":204,"line":422},[202,754,755],{},"class Composite extends Component\n",[202,757,758],{"class":204,"line":428},[202,759,608],{},[202,761,762],{"class":204,"line":434},[202,763,764],{},"    protected \\SplObjectStorage $children;\n",[202,766,767],{"class":204,"line":439},[202,768,227],{"emptyLinePlaceholder":226},[202,770,772],{"class":204,"line":771},43,[202,773,774],{},"    public function __construct()\n",[202,776,778],{"class":204,"line":777},44,[202,779,627],{},[202,781,783],{"class":204,"line":782},45,[202,784,785],{},"        $this->children = new \\SplObjectStorage();\n",[202,787,789],{"class":204,"line":788},46,[202,790,245],{},[202,792,794],{"class":204,"line":793},47,[202,795,227],{"emptyLinePlaceholder":226},[202,797,799],{"class":204,"line":798},48,[202,800,801],{},"    public function add(Component $component): void\n",[202,803,805],{"class":204,"line":804},49,[202,806,627],{},[202,808,810],{"class":204,"line":809},50,[202,811,812],{},"        $this->children->attach($component);\n",[202,814,816],{"class":204,"line":815},51,[202,817,818],{},"        $component->setParent($this);\n",[202,820,822],{"class":204,"line":821},52,[202,823,245],{},[202,825,827],{"class":204,"line":826},53,[202,828,227],{"emptyLinePlaceholder":226},[202,830,832],{"class":204,"line":831},54,[202,833,834],{},"    public function remove(Component $component): void\n",[202,836,838],{"class":204,"line":837},55,[202,839,627],{},[202,841,843],{"class":204,"line":842},56,[202,844,845],{},"        $this->children->detach($component);\n",[202,847,849],{"class":204,"line":848},57,[202,850,851],{},"        $component->setParent(null);\n",[202,853,855],{"class":204,"line":854},58,[202,856,245],{},[202,858,860],{"class":204,"line":859},59,[202,861,227],{"emptyLinePlaceholder":226},[202,863,865],{"class":204,"line":864},60,[202,866,685],{},[202,868,870],{"class":204,"line":869},61,[202,871,627],{},[202,873,875],{"class":204,"line":874},62,[202,876,877],{},"        return true;\n",[202,879,881],{"class":204,"line":880},63,[202,882,245],{},[202,884,886],{"class":204,"line":885},64,[202,887,227],{"emptyLinePlaceholder":226},[202,889,891],{"class":204,"line":890},65,[202,892,729],{},[202,894,896],{"class":204,"line":895},66,[202,897,627],{},[202,899,901],{"class":204,"line":900},67,[202,902,903],{},"        $results = [];\n",[202,905,907],{"class":204,"line":906},68,[202,908,909],{},"        foreach ($this->children as $child) {\n",[202,911,913],{"class":204,"line":912},69,[202,914,915],{},"            $results[] = $child->operation();\n",[202,917,919],{"class":204,"line":918},70,[202,920,425],{},[202,922,924],{"class":204,"line":923},71,[202,925,227],{"emptyLinePlaceholder":226},[202,927,929],{"class":204,"line":928},72,[202,930,931],{},"        return \"Branch(\" . implode(\"+\", $results) . \")\";\n",[202,933,935],{"class":204,"line":934},73,[202,936,245],{},[202,938,940],{"class":204,"line":939},74,[202,941,262],{},[202,943,945],{"class":204,"line":944},75,[202,946,227],{"emptyLinePlaceholder":226},[202,948,950],{"class":204,"line":949},76,[202,951,952],{},"function clientCode(Component $component)\n",[202,954,956],{"class":204,"line":955},77,[202,957,608],{},[202,959,961],{"class":204,"line":960},78,[202,962,963],{},"    echo \"RESULT: \" . $component->operation();\n",[202,965,967],{"class":204,"line":966},79,[202,968,262],{},[202,970,972],{"class":204,"line":971},80,[202,973,227],{"emptyLinePlaceholder":226},[202,975,977],{"class":204,"line":976},81,[202,978,979],{},"$simple = new Leaf();\n",[202,981,983],{"class":204,"line":982},82,[202,984,985],{},"echo \"Client: Basit bir bileşen çalıştırılıyor:\\n\";\n",[202,987,989],{"class":204,"line":988},83,[202,990,991],{},"clientCode($simple);\n",[202,993,995],{"class":204,"line":994},84,[202,996,997],{},"echo \"\\n\\n\";\n",[202,999,1001],{"class":204,"line":1000},85,[202,1002,227],{"emptyLinePlaceholder":226},[202,1004,1006],{"class":204,"line":1005},86,[202,1007,1008],{},"$tree = new Composite();\n",[202,1010,1012],{"class":204,"line":1011},87,[202,1013,1014],{},"$branch1 = new Composite();\n",[202,1016,1018],{"class":204,"line":1017},88,[202,1019,1020],{},"$branch1->add(new Leaf());\n",[202,1022,1024],{"class":204,"line":1023},89,[202,1025,1020],{},[202,1027,1029],{"class":204,"line":1028},90,[202,1030,227],{"emptyLinePlaceholder":226},[202,1032,1034],{"class":204,"line":1033},91,[202,1035,1036],{},"$branch2 = new Composite();\n",[202,1038,1040],{"class":204,"line":1039},92,[202,1041,1042],{},"$branch2->add(new Leaf());\n",[202,1044,1046],{"class":204,"line":1045},93,[202,1047,227],{"emptyLinePlaceholder":226},[202,1049,1051],{"class":204,"line":1050},94,[202,1052,1053],{},"$tree->add($branch1);\n",[202,1055,1057],{"class":204,"line":1056},95,[202,1058,1059],{},"$tree->add($branch2);\n",[202,1061,1063],{"class":204,"line":1062},96,[202,1064,227],{"emptyLinePlaceholder":226},[202,1066,1068],{"class":204,"line":1067},97,[202,1069,1070],{},"echo \"Client: Karmaşık bir kompozit ağaç çalıştırılıyor:\\n\";\n",[202,1072,1074],{"class":204,"line":1073},98,[202,1075,1076],{},"clientCode($tree);\n",[202,1078,1080],{"class":204,"line":1079},99,[202,1081,997],{},[202,1083,1085],{"class":204,"line":1084},100,[202,1086,227],{"emptyLinePlaceholder":226},[202,1088,1090],{"class":204,"line":1089},101,[202,1091,1092],{},"function clientCode2(Component $component1, Component $component2)\n",[202,1094,1096],{"class":204,"line":1095},102,[202,1097,608],{},[202,1099,1101],{"class":204,"line":1100},103,[202,1102,1103],{},"    if ($component1->isComposite()) {\n",[202,1105,1107],{"class":204,"line":1106},104,[202,1108,1109],{},"        $component1->add($component2);\n",[202,1111,1113],{"class":204,"line":1112},105,[202,1114,245],{},[202,1116,1118],{"class":204,"line":1117},106,[202,1119,1120],{},"    echo \"RESULT: \" . $component1->operation();\n",[202,1122,1124],{"class":204,"line":1123},107,[202,1125,262],{},[202,1127,1129],{"class":204,"line":1128},108,[202,1130,227],{"emptyLinePlaceholder":226},[202,1132,1134],{"class":204,"line":1133},109,[202,1135,1136],{},"echo \"Client: Sınıf kontrolü yapmadan ağaca yeni eleman ekleniyor:\\n\";\n",[202,1138,1140],{"class":204,"line":1139},110,[202,1141,1142],{},"clientCode2($tree, $simple);\n",[572,1144,1146],{"id":1145},"örnek-python-kodu","Örnek Python Kodu",[193,1148,1152],{"className":1149,"code":1150,"language":1151,"meta":198,"style":198},"language-python shiki shiki-themes github-light github-dark","from __future__ import annotations\nfrom abc import ABC, abstractmethod\nfrom typing import List\n\nclass Component(ABC):\n    @property\n    def parent(self) -> Component:\n        return self._parent\n\n    @parent.setter\n    def parent(self, parent: Component):\n        self._parent = parent\n\n    def add(self, component: Component) -> None:\n        pass\n\n    def remove(self, component: Component) -> None:\n        pass\n\n    def is_composite(self) -> bool:\n        return False\n\n    @abstractmethod\n    def operation(self) -> str:\n        pass\n\n\nclass Leaf(Component):\n    def operation(self) -> str:\n        return \"Leaf\"\n\n\nclass Composite(Component):\n    def __init__(self) -> None:\n        self._children: List[Component] = []\n\n    def add(self, component: Component) -> None:\n        self._children.append(component)\n        component.parent = self\n\n    def remove(self, component: Component) -> None:\n        self._children.remove(component)\n        component.parent = None\n\n    def is_composite(self) -> bool:\n        return True\n\n    def operation(self) -> str:\n        results = []\n        for child in self._children:\n            results.append(child.operation())\n        return f\"Branch({'+'.join(results)})\"\n\n\ndef client_code(component: Component) -> None:\n    print(f\"RESULT: {component.operation()}\", end=\"\")\n\n\ndef client_code2(component1: Component, component2: Component) -> None:\n    if component1.is_composite():\n        component1.add(component2)\n    print(f\"RESULT: {component1.operation()}\", end=\"\")\n\n\nif __name__ == \"__main__\":\n    simple = Leaf()\n    print(\"Client: Basit bir bileşen çalıştırılıyor:\")\n    client_code(simple)\n    print(\"\\n\")\n\n    tree = Composite()\n    branch1 = Composite()\n    branch1.add(Leaf())\n    branch1.add(Leaf())\n\n    branch2 = Composite()\n    branch2.add(Leaf())\n\n    tree.add(branch1)\n    tree.add(branch2)\n\n    print(\"Client: Karmaşık bir kompozit ağaç çalıştırılıyor:\")\n    client_code(tree)\n    print(\"\\n\")\n\n    print(\"Client: Sınıf kontrolü yapmadan ağaca yeni eleman ekleniyor:\")\n    client_code2(tree, simple)\n","python",[63,1153,1154,1159,1164,1169,1173,1178,1183,1188,1193,1197,1202,1207,1212,1216,1221,1226,1230,1235,1239,1243,1248,1253,1257,1262,1267,1271,1275,1279,1284,1288,1293,1297,1301,1306,1311,1316,1320,1324,1329,1334,1338,1342,1347,1352,1356,1360,1365,1369,1373,1378,1383,1388,1393,1397,1401,1406,1411,1415,1419,1424,1429,1434,1439,1443,1447,1452,1457,1462,1467,1472,1476,1481,1486,1491,1495,1499,1504,1509,1513,1518,1523,1527,1532,1537,1541,1545,1550],{"__ignoreMap":198},[202,1155,1156],{"class":204,"line":205},[202,1157,1158],{},"from __future__ import annotations\n",[202,1160,1161],{"class":204,"line":211},[202,1162,1163],{},"from abc import ABC, abstractmethod\n",[202,1165,1166],{"class":204,"line":217},[202,1167,1168],{},"from typing import List\n",[202,1170,1171],{"class":204,"line":223},[202,1172,227],{"emptyLinePlaceholder":226},[202,1174,1175],{"class":204,"line":230},[202,1176,1177],{},"class Component(ABC):\n",[202,1179,1180],{"class":204,"line":236},[202,1181,1182],{},"    @property\n",[202,1184,1185],{"class":204,"line":242},[202,1186,1187],{},"    def parent(self) -> Component:\n",[202,1189,1190],{"class":204,"line":248},[202,1191,1192],{},"        return self._parent\n",[202,1194,1195],{"class":204,"line":253},[202,1196,227],{"emptyLinePlaceholder":226},[202,1198,1199],{"class":204,"line":259},[202,1200,1201],{},"    @parent.setter\n",[202,1203,1204],{"class":204,"line":265},[202,1205,1206],{},"    def parent(self, parent: Component):\n",[202,1208,1209],{"class":204,"line":270},[202,1210,1211],{},"        self._parent = parent\n",[202,1213,1214],{"class":204,"line":276},[202,1215,227],{"emptyLinePlaceholder":226},[202,1217,1218],{"class":204,"line":282},[202,1219,1220],{},"    def add(self, component: Component) -> None:\n",[202,1222,1223],{"class":204,"line":288},[202,1224,1225],{},"        pass\n",[202,1227,1228],{"class":204,"line":293},[202,1229,227],{"emptyLinePlaceholder":226},[202,1231,1232],{"class":204,"line":299},[202,1233,1234],{},"    def remove(self, component: Component) -> None:\n",[202,1236,1237],{"class":204,"line":305},[202,1238,1225],{},[202,1240,1241],{"class":204,"line":311},[202,1242,227],{"emptyLinePlaceholder":226},[202,1244,1245],{"class":204,"line":316},[202,1246,1247],{},"    def is_composite(self) -> bool:\n",[202,1249,1250],{"class":204,"line":321},[202,1251,1252],{},"        return False\n",[202,1254,1255],{"class":204,"line":327},[202,1256,227],{"emptyLinePlaceholder":226},[202,1258,1259],{"class":204,"line":333},[202,1260,1261],{},"    @abstractmethod\n",[202,1263,1264],{"class":204,"line":338},[202,1265,1266],{},"    def operation(self) -> str:\n",[202,1268,1269],{"class":204,"line":343},[202,1270,1225],{},[202,1272,1273],{"class":204,"line":348},[202,1274,227],{"emptyLinePlaceholder":226},[202,1276,1277],{"class":204,"line":354},[202,1278,227],{"emptyLinePlaceholder":226},[202,1280,1281],{"class":204,"line":360},[202,1282,1283],{},"class Leaf(Component):\n",[202,1285,1286],{"class":204,"line":366},[202,1287,1266],{},[202,1289,1290],{"class":204,"line":371},[202,1291,1292],{},"        return \"Leaf\"\n",[202,1294,1295],{"class":204,"line":377},[202,1296,227],{"emptyLinePlaceholder":226},[202,1298,1299],{"class":204,"line":383},[202,1300,227],{"emptyLinePlaceholder":226},[202,1302,1303],{"class":204,"line":388},[202,1304,1305],{},"class Composite(Component):\n",[202,1307,1308],{"class":204,"line":393},[202,1309,1310],{},"    def __init__(self) -> None:\n",[202,1312,1313],{"class":204,"line":398},[202,1314,1315],{},"        self._children: List[Component] = []\n",[202,1317,1318],{"class":204,"line":404},[202,1319,227],{"emptyLinePlaceholder":226},[202,1321,1322],{"class":204,"line":410},[202,1323,1220],{},[202,1325,1326],{"class":204,"line":416},[202,1327,1328],{},"        self._children.append(component)\n",[202,1330,1331],{"class":204,"line":422},[202,1332,1333],{},"        component.parent = self\n",[202,1335,1336],{"class":204,"line":428},[202,1337,227],{"emptyLinePlaceholder":226},[202,1339,1340],{"class":204,"line":434},[202,1341,1234],{},[202,1343,1344],{"class":204,"line":439},[202,1345,1346],{},"        self._children.remove(component)\n",[202,1348,1349],{"class":204,"line":771},[202,1350,1351],{},"        component.parent = None\n",[202,1353,1354],{"class":204,"line":777},[202,1355,227],{"emptyLinePlaceholder":226},[202,1357,1358],{"class":204,"line":782},[202,1359,1247],{},[202,1361,1362],{"class":204,"line":788},[202,1363,1364],{},"        return True\n",[202,1366,1367],{"class":204,"line":793},[202,1368,227],{"emptyLinePlaceholder":226},[202,1370,1371],{"class":204,"line":798},[202,1372,1266],{},[202,1374,1375],{"class":204,"line":804},[202,1376,1377],{},"        results = []\n",[202,1379,1380],{"class":204,"line":809},[202,1381,1382],{},"        for child in self._children:\n",[202,1384,1385],{"class":204,"line":815},[202,1386,1387],{},"            results.append(child.operation())\n",[202,1389,1390],{"class":204,"line":821},[202,1391,1392],{},"        return f\"Branch({'+'.join(results)})\"\n",[202,1394,1395],{"class":204,"line":826},[202,1396,227],{"emptyLinePlaceholder":226},[202,1398,1399],{"class":204,"line":831},[202,1400,227],{"emptyLinePlaceholder":226},[202,1402,1403],{"class":204,"line":837},[202,1404,1405],{},"def client_code(component: Component) -> None:\n",[202,1407,1408],{"class":204,"line":842},[202,1409,1410],{},"    print(f\"RESULT: {component.operation()}\", end=\"\")\n",[202,1412,1413],{"class":204,"line":848},[202,1414,227],{"emptyLinePlaceholder":226},[202,1416,1417],{"class":204,"line":854},[202,1418,227],{"emptyLinePlaceholder":226},[202,1420,1421],{"class":204,"line":859},[202,1422,1423],{},"def client_code2(component1: Component, component2: Component) -> None:\n",[202,1425,1426],{"class":204,"line":864},[202,1427,1428],{},"    if component1.is_composite():\n",[202,1430,1431],{"class":204,"line":869},[202,1432,1433],{},"        component1.add(component2)\n",[202,1435,1436],{"class":204,"line":874},[202,1437,1438],{},"    print(f\"RESULT: {component1.operation()}\", end=\"\")\n",[202,1440,1441],{"class":204,"line":880},[202,1442,227],{"emptyLinePlaceholder":226},[202,1444,1445],{"class":204,"line":885},[202,1446,227],{"emptyLinePlaceholder":226},[202,1448,1449],{"class":204,"line":890},[202,1450,1451],{},"if __name__ == \"__main__\":\n",[202,1453,1454],{"class":204,"line":895},[202,1455,1456],{},"    simple = Leaf()\n",[202,1458,1459],{"class":204,"line":900},[202,1460,1461],{},"    print(\"Client: Basit bir bileşen çalıştırılıyor:\")\n",[202,1463,1464],{"class":204,"line":906},[202,1465,1466],{},"    client_code(simple)\n",[202,1468,1469],{"class":204,"line":912},[202,1470,1471],{},"    print(\"\\n\")\n",[202,1473,1474],{"class":204,"line":918},[202,1475,227],{"emptyLinePlaceholder":226},[202,1477,1478],{"class":204,"line":923},[202,1479,1480],{},"    tree = Composite()\n",[202,1482,1483],{"class":204,"line":928},[202,1484,1485],{},"    branch1 = Composite()\n",[202,1487,1488],{"class":204,"line":934},[202,1489,1490],{},"    branch1.add(Leaf())\n",[202,1492,1493],{"class":204,"line":939},[202,1494,1490],{},[202,1496,1497],{"class":204,"line":944},[202,1498,227],{"emptyLinePlaceholder":226},[202,1500,1501],{"class":204,"line":949},[202,1502,1503],{},"    branch2 = Composite()\n",[202,1505,1506],{"class":204,"line":955},[202,1507,1508],{},"    branch2.add(Leaf())\n",[202,1510,1511],{"class":204,"line":960},[202,1512,227],{"emptyLinePlaceholder":226},[202,1514,1515],{"class":204,"line":966},[202,1516,1517],{},"    tree.add(branch1)\n",[202,1519,1520],{"class":204,"line":971},[202,1521,1522],{},"    tree.add(branch2)\n",[202,1524,1525],{"class":204,"line":976},[202,1526,227],{"emptyLinePlaceholder":226},[202,1528,1529],{"class":204,"line":982},[202,1530,1531],{},"    print(\"Client: Karmaşık bir kompozit ağaç çalıştırılıyor:\")\n",[202,1533,1534],{"class":204,"line":988},[202,1535,1536],{},"    client_code(tree)\n",[202,1538,1539],{"class":204,"line":994},[202,1540,1471],{},[202,1542,1543],{"class":204,"line":1000},[202,1544,227],{"emptyLinePlaceholder":226},[202,1546,1547],{"class":204,"line":1005},[202,1548,1549],{},"    print(\"Client: Sınıf kontrolü yapmadan ağaca yeni eleman ekleniyor:\")\n",[202,1551,1552],{"class":204,"line":1011},[202,1553,1554],{},"    client_code2(tree, simple)\n",[87,1556],{},[90,1558,1560],{"id":1559},"sıkça-sorulan-sorular-faq","Sıkça Sorulan Sorular (FAQ)",[572,1562,1564,1565,1568,1569,1572,1573,1575],{"id":1563},"bileşen-yönetimi-add-remove-metotlarının-ortak-component-sınıfında-tanımlanması-neden-bir-tasarım-çelişkisidir-design-trade-off","Bileşen yönetimi (",[63,1566,1567],{},"add",", ",[63,1570,1571],{},"remove",") metotlarının ortak ",[63,1574,65],{}," sınıfında tanımlanması neden bir tasarım çelişkisidir (Design Trade-off)?",[11,1577,1578,1579,1582],{},"Bu durum ",[43,1580,1581],{},"Arayüz Ayrımı Prensibi (Interface Segregation Principle - ISP)"," ile polimorfizm arasındaki bir trade-off'tur:",[47,1584,1585,1599],{},[50,1586,1587,1588,1590,1591,1594,1595,1598],{},"Eğer bu metotları ",[63,1589,65],{}," sınıfına koyarsanız, istemci kod yaprak veya dal ayrımı yapmadan tüm nesnelerde ",[63,1592,1593],{},"add()"," çağırabilir. Bu durum ",[43,1596,1597],{},"tek tip kullanımı (uniformity)"," maksimuma çıkarır. Ancak yaprak sınıflarında bu metotlar anlamsız\u002Fboş kalır.",[50,1600,1601,1602,1604,1605,1608,1609,1612,1613,1616],{},"Eğer bu metotları sadece ",[63,1603,73],{}," sınıfına koyarsanız, istemci kodun nesneleri eklemeden önce ",[63,1606,1607],{},"isComposite()"," veya ",[63,1610,1611],{},"instanceof"," ile kontrol etmesi gerekir. Bu da ",[43,1614,1615],{},"güvenliği (safety)"," artırır ancak kodun polimorfik esnekliğini azaltır.",[572,1618,1620],{"id":1619},"derin-ağaç-yapılarında-özyinelemeli-recursive-hesaplamaların-getireceği-performans-yükü-nasıl-optimize-edilir","Derin ağaç yapılarında özyinelemeli (recursive) hesaplamaların getireceği performans yükü nasıl optimize edilir?",[11,1622,1623,1624,1627,1628,1631,1632,1634,1635,1634,1637,1640],{},"Çok derin ağaçlarda ",[63,1625,1626],{},"operation()"," çağrısı tüm alt dallara gideceği için ciddi bir CPU maliyeti oluşturabilir. Bunu engellemek için ",[43,1629,1630],{},"önbellekleme (caching)"," uygulanabilir. Ağaçtaki her düğüm alt elemanlarının hesaplanmış toplam değerini hafızada tutar. Alt elemanlarda bir değişiklik (",[63,1633,1567],{}," \u002F ",[63,1636,1571],{},[63,1638,1639],{},"update",") olduğunda, ilgili düğüm kendi üst düğümüne (parent) haber vererek önbelleğin temizlenmesini (cache invalidation) tetikler.",[572,1642,1644],{"id":1643},"html-dom-yapısı-ile-composite-deseni-arasındaki-ilişki-nedir","HTML DOM yapısı ile Composite deseni arasındaki ilişki nedir?",[11,1646,1647,1648,1568,1651,1568,1654,1657,1658,1660,1661,1568,1663,1666,1667,1669,1670,1608,1673,1676],{},"Modern web tarayıcılarındaki HTML DOM (Document Object Model) yapısı tamamen Composite desenine dayanır. ",[63,1649,1650],{},"document",[63,1652,1653],{},"div",[63,1655,1656],{},"section"," gibi elemanlar birer ",[43,1659,73],{}," nesnesiyken; ",[63,1662,125],{},[63,1664,1665],{},"input"," veya düz metin (TextNode) düğümleri birer ",[43,1668,69],{}," nesnesidir. Hepsi ortak bir ",[63,1671,1672],{},"Node",[63,1674,1675],{},"Element"," sınıfından türediği için tarayıcı tüm ağacı tek elden parse edip render edebilir.",[87,1678],{},[90,1680,1682],{"id":1681},"diğer-tasarım-kalıplarıdesign-patterns","Diğer Tasarım Kalıpları\u002FDesign Patterns",[11,1684,1685],{},[43,1686,1687],{},"Oluşumsal Kalıplar (Creational Patterns)",[11,1689,1690,1694,1695,1694,1699,1694,1702,1694,1706],{},[15,1691,1693],{"href":1692},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-factory-method-nedir","Factory Method",",\n",[15,1696,1698],{"href":1697},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-abstract-factory-nedir","Abstract Factory",[15,1700,543],{"href":1701},"\u002Ftr\u002Fbuilder-tasarim-deseni-nedir",[15,1703,1705],{"href":1704},"\u002Ftr\u002Fprototype-tasarim-deseni-nedir","Prototype",[15,1707,1709],{"href":1708},"\u002Ftr\u002Fsingleton-tasarim-deseni-nedir","Singleton",[11,1711,1712],{},[43,1713,1714],{},"Yapısal Kalıplar (Structural Patterns)",[11,1716,1717,1694,1721,1694,1725,1694,1728,1694,1731,1694,1735,1694,1739],{},[15,1718,1720],{"href":1719},"\u002Ftr\u002Fadapter-tasarim-deseni-nedir","Adapter",[15,1722,1724],{"href":1723},"\u002Ftr\u002Fbridge-tasarim-deseni-nedir","Bridge",[15,1726,73],{"href":1727},"\u002Ftr\u002Fcomposite-tasarim-deseni-nedir",[15,1729,490],{"href":1730},"\u002Ftr\u002Fdecorator-tasarim-deseni-nedir",[15,1732,1734],{"href":1733},"\u002Ftr\u002Ffacade-tasarim-deseni-nedir","Facade",[15,1736,1738],{"href":1737},"\u002Ftr\u002Fflyweight-tasarim-deseni-nedir","Flyweight",[15,1740,1742],{"href":1741},"\u002Ftr\u002Fproxy-tasarim-deseni-nedir","Proxy",[11,1744,1745],{},[43,1746,1747],{},"Davranışsal Kalıplar (Behavioral Patterns)",[11,1749,1750,1694,1753,1694,1757,1694,1761,1694,1765,1694,1769,1694,1773,1694,1777,1694,1781,1694,1785],{},[15,1751,503],{"href":1752},"\u002Ftr\u002Fchain-of-responsibility-deseni-nedir",[15,1754,1756],{"href":1755},"\u002Ftr\u002Fcommand-tasarim-deseni-nedir","Command",[15,1758,1760],{"href":1759},"\u002Ftr\u002Fiterator-tasarim-deseni-nedir","Iterator",[15,1762,1764],{"href":1763},"\u002Ftr\u002Fmediator-tasarim-deseni-nedir","Mediator",[15,1766,1768],{"href":1767},"\u002Ftr\u002Fmemento-tasarim-deseni-nedir","Memento",[15,1770,1772],{"href":1771},"\u002Ftr\u002Fobserver-tasarim-deseni-nedir","Observer",[15,1774,1776],{"href":1775},"\u002Ftr\u002Fstate-tasarim-deseni-nedir","State",[15,1778,1780],{"href":1779},"\u002Ftr\u002Fstrategy-tasarim-deseni-nedir","Strategy",[15,1782,1784],{"href":1783},"\u002Ftr\u002Ftemplate-method-tasarim-deseni-nedir","Template Method",[15,1786,555],{"href":1787},"\u002Ftr\u002Fvisitor-tasarim-deseni-nedir",[1789,1790,1791],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":198,"searchDepth":211,"depth":211,"links":1793},[1794,1795,1796,1797,1798,1799,1800,1801,1805,1811],{"id":92,"depth":211,"text":93},{"id":103,"depth":211,"text":104},{"id":136,"depth":211,"text":137},{"id":187,"depth":211,"text":188},{"id":446,"depth":211,"text":447},{"id":514,"depth":211,"text":515},{"id":534,"depth":211,"text":535},{"id":569,"depth":211,"text":570,"children":1802},[1803,1804],{"id":574,"depth":217,"text":575},{"id":1145,"depth":217,"text":1146},{"id":1559,"depth":211,"text":1560,"children":1806},[1807,1809,1810],{"id":1563,"depth":217,"text":1808},"Bileşen yönetimi (add, remove) metotlarının ortak Component sınıfında tanımlanması neden bir tasarım çelişkisidir (Design Trade-off)?",{"id":1619,"depth":217,"text":1620},{"id":1643,"depth":217,"text":1644},{"id":1681,"depth":211,"text":1682},[1813],"technical",null,"2021-09-11","Composite (Kompozit) tasarım kalıbını, ağaç yapılarını, dosya sistemi senaryolarını ve PHP\u002FPython kod örneklerini öğrenin.",false,"md","\u002Fimages\u002Fposts\u002F2021\u002F09\u002Fcomposite-design-pattern.avif",{},{"title":6,"description":1816},"composite-tasarim-deseni-nedir","tr\u002Fcomposite-tasarim-deseni-nedir",[1825,1826],"design-pattern","ipucu","sy7OfxqbA8Qp2VhtxJnEHP99dLUYkxBTxaEP0-g96uA",{"prev":1829,"next":1831,"others":1834,"lucky":1941,"readingTime":242},{"path":1730,"title":1830},"Decorator Tasarım Deseni Nedir?",{"path":1832,"title":1833},"\u002Ftr\u002Fearly-return-erken-donus-nedir","Early Return \u002F Erken Dönüş nedir?",[1835,1838,1840,1843,1846,1849,1851,1854,1857,1860,1863,1866,1868,1870,1873,1875,1878,1881,1884,1885,1887,1890,1893,1895,1898,1901,1904,1906,1908,1911,1913,1915,1918,1921,1924,1927,1930,1933,1936,1938],{"path":1836,"title":1837},"\u002Ftr\u002Ffull-stack-proje-gelistiriyoruz","Full Stack Proje Geliştiriyoruz",{"path":1783,"title":1839},"Template Method Tasarım Deseni Nedir?",{"path":1841,"title":1842},"\u002Ftr\u002Fyeni-tema-honeywind","Yeni WordPress Temam Honeywind: Tailwind CSS ve Minimalizm",{"path":1844,"title":1845},"\u002Ftr\u002Fvite-nedir","Vite Nedir? Modern Web Geliştirme ve Paketleme Aracı",{"path":1847,"title":1848},"\u002Ftr\u002Ftailwind-css-nerede-kullanilir-tailwind-css-nerede-kullanilmaz","Tailwind CSS Nerede Kullanılır? Tailwind CSS Nerede Kullanılmaz?",{"path":1723,"title":1850},"Bridge Tasarım Deseni Nedir?",{"path":1852,"title":1853},"\u002Ftr\u002Fgarbage-collection-ve-golang","Garbage Collection ve Go (Golang)",{"path":1855,"title":1856},"\u002Ftr\u002Fwindows-10-golang-kurulumu","Windows 10 ve 11'de Golang Kurulumu ve GOPATH Yapılandırması",{"path":1858,"title":1859},"\u002Ftr\u002Fgo-slice-veri-tipi","Go Veri Tipleri: Slice",{"path":1861,"title":1862},"\u002Ftr\u002Fheadless-wordpress-hakkinda-her-sey","Headless WordPress Hakkında Her Şey",{"path":1864,"title":1865},"\u002Ftr\u002Fphp-ve-makine-ogrenimi-php-ml-kutuphanesi","PHP ve Makine Öğrenimi: PHP-ML Kütüphanesi ile Pratik Çözümler",{"path":1755,"title":1867},"Command Tasarım Deseni Nedir?",{"path":1787,"title":1869},"Visitor Tasarım Deseni Nedir?",{"path":1871,"title":1872},"\u002Ftr\u002Ffactory-method-ve-abstract-factory-farki-nedir","Factory Method ve Abstract Factory Farkı Nedir?",{"path":1771,"title":1874},"Observer Tasarım Deseni Nedir?",{"path":1876,"title":1877},"\u002Ftr\u002Fgo-programlama-dilinin-ozellikleri","Go Programlama Dilinin Özellikleri",{"path":1879,"title":1880},"\u002Ftr\u002Fjwt-guvenli-mi-guvenlik-acigi-olusturmayin","JWT Güvenli Derken Güvenlik Açığı Oluşturmayın",{"path":1882,"title":1883},"\u002Ftr\u002Fes17-nedir-ecmascript-2026-nedir","ES17 nedir? ECMAScript 2026 nedir?",{"path":1832,"title":1833},{"path":1697,"title":1886},"Abstract Factory Tasarım Deseni Nedir?",{"path":1888,"title":1889},"\u002Ftr\u002Fes14-nedir-ecmascript-2023-nedir","ES14 nedir? ECMAScript 2023 nedir?",{"path":1891,"title":1892},"\u002Ftr\u002Fmerhaba-gluster","Merhaba Gluster: Dağıtık Dosya Sistemi Nedir?",{"path":17,"title":1894},"Design Patterns \u002F Tasarım Desenleri nedir?",{"path":1896,"title":1897},"\u002Ftr\u002Fopenlitespeed-ve-litespeed-enterprisei-reverse-proxy-olarak-kullanmak","OpenLiteSpeed ve LiteSpeed Enterprise Sunucularını Reverse Proxy Olarak Kullanmak",{"path":1899,"title":1900},"\u002Ftr\u002Fubuntu-24-04-uzerinde-cyberpanel-kurulumu","Ubuntu 24.04 LTS ve 22.04 LTS Üzerinde CyberPanel Kurulumu",{"path":1902,"title":1903},"\u002Ftr\u002Fes6-nedir-ecmascript-2015-nedir","ES6 Nedir? ECMAScript 2015 Nedir?",{"path":1737,"title":1905},"Flyweight Tasarım Deseni Nedir?",{"path":1775,"title":1907},"State Tasarım Deseni Nedir?",{"path":1909,"title":1910},"\u002Ftr\u002Fes7-nedir-ecmascript-2016-nedir","ES7 Nedir? ECMAScript 2016 Nedir?",{"path":1701,"title":1912},"Builder Tasarım Deseni Nedir?",{"path":1752,"title":1914},"Chain of Responsibility Deseni Nedir?",{"path":1916,"title":1917},"\u002Ftr\u002Fapi-gateway-nedir","API Gateway Nedir? Ne İşe Yarar?",{"path":1919,"title":1920},"\u002Ftr\u002Fdocker-ve-portainer-kurulumu","Docker ve Portainer Kurulumu",{"path":1922,"title":1923},"\u002Ftr\u002Ftemiz-moduler-ve-yeniden-kullanilabilir-php-kodu-yazma-rehberi","PHP'de Temiz, Modüler ve Yeniden Kullanılabilir Kod Yazma Rehberi",{"path":1925,"title":1926},"\u002Ftr\u002Fgo-veri-tipleri-map","Go Veri Tipleri - Map",{"path":1928,"title":1929},"\u002Ftr\u002Fdocker-ile-mariadb-kurulumu","Docker ile MariaDB Kurulumu",{"path":1931,"title":1932},"\u002Ftr\u002Fes15-nedir-ecmascript-2024-nedir","ES15 nedir? ECMAScript 2024 nedir?",{"path":1934,"title":1935},"\u002Ftr\u002Fmutable-ve-immutable-kavrami","Mutable ve Immutable Kavramları Nedir?",{"path":1733,"title":1937},"Facade Tasarım Deseni Nedir?",{"path":1939,"title":1940},"\u002Ftr\u002Fecmascript-nedir-ecmascript-ne-degildir-bilinmesi-gerekenler","ECMAScript Nedir? Bilinmesi Gerekenler...",{"path":1942,"title":1943},"\u002Ftr\u002Fdocker-swarm-nedir","Docker Swarm Nedir?",[1945,1947,1949,1952],{"path":1787,"title":1869,"date":1946},"2021-10-09",{"path":1783,"title":1839,"date":1948},"2021-10-08",{"path":1779,"title":1950,"date":1951},"Strategy Tasarım Deseni Nedir?","2021-10-07",{"path":1775,"title":1907,"date":1953},"2021-10-06",[1955,1959,1962],{"path":1956,"title":1957,"date":1958},"\u002Ftr\u002Fvue-js-nedir","Vue.js Nedir? Yeni Başlayanlar İçin Rehber","2020-12-08",{"path":1767,"title":1960,"date":1961},"Memento Tasarım Deseni Nedir?","2021-10-04",{"path":1855,"title":1856,"date":1963},"2021-09-28",1782142081974]