[{"data":1,"prerenderedAt":1271},["ShallowReactive",2],{"post-\u002Ftr\u002Fadapter-tasarim-deseni-nedir":3},{"page":4,"translation":1114,"nav":1130,"related":1248,"random":1260},{"id":5,"title":6,"body":7,"categories":1112,"category":1114,"date":1115,"description":1116,"draft":1117,"extension":1118,"image":1119,"kind":1114,"lang":331,"meta":1120,"navigation":203,"path":1017,"readingTime":207,"seo":1121,"slug":1122,"stem":1123,"tags":1124,"translationKey":1114,"type":1113,"updated":1114,"__hash__":1129},"postsTr\u002Ftr\u002Fadapter-tasarim-deseni-nedir.md","Adapter Tasarım Deseni Nedir?",{"type":8,"value":9,"toc":1089},"minimark",[10,20,33,36,81,84,89,94,96,100,103,106,113,116,118,122,129,132,135,147,152,155,157,161,164,318,320,324,413,415,419,422,427,433,437,440,442,446,460,462,466,488,490,494,498,776,780,925,927,931,935,949,953,956,960,974,976,980,985,1008,1013,1038,1043,1085],[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ç:"," Birbiriyle uyumsuz arayüzlere (interface) sahip iki farklı sınıfın, aralarında bir \"tercüman\" görevi üstlenen adaptör nesnesi aracılığıyla uyum içinde çalışmasını sağlar.",[50,57,58,61,62,66,67,70,71,74],{},[43,59,60],{},"Kilit Yapılar:"," Hedef Arayüz (",[63,64,65],"code",{},"Target","), Uyumsuz Sınıf (",[63,68,69],{},"Adaptee","), Adaptör (",[63,72,73],{},"Adapter",").",[50,76,77,80],{},[43,78,79],{},"Sınıf vs Nesne Adaptörü:"," Sınıf adaptörleri kalıtım (inheritance) yoluyla çalışırken, nesne adaptörleri kompozisyon (composition) kullanarak hedef nesneyi sarmalar.",[82,83],"hr",{},[85,86,88],"h2",{"id":87},"adapter-deseninin-amacı","Adapter Deseninin Amacı",[11,90,91,93],{},[43,92,73],{}," (Adaptör), birbiriyle uyumlu olmayan arayüzlere sahip nesnelerin birlikte çalışabilmelerini sağlayan yapısal (structural) bir tasarım desenidir.",[82,95],{},[85,97,99],{"id":98},"sorun","Sorun",[11,101,102],{},"Hisse senedi piyasalarını takip etmeyi sağlayan bir uygulama geliştirdiğinizi düşünün. Uygulamanız piyasa verilerini farklı kaynaklardan XML formatında çekiyor ve daha sonra güzel görünümlü grafikler ve diyagramlar ile kullanıcıya sunuyor olsun.",[11,104,105],{},"Günün birinde üçüncü parti bir analiz kütüphanesi entegre ederek uygulamayı daha da geliştirmeye karar verdiniz. Yalnız bir sorun var, bu analiz kütüphanesi yalnızca JSON formatı ile çalışabiliyor.",[11,107,108],{},[109,110],"img",{"alt":111,"src":112},"","\u002Fimages\u002Fadapter-tasarim-deseni-nedir\u002Fadapter-deseninin-cozdugu-problem.avif",[11,114,115],{},"Kütüphaneyi XML ile çalışabilecek hale getirmek için kütüphanenin kodunu değiştirmeyi düşünebilirsiniz. Ancak kütüphanenin kaynak koduna erişiminiz olmayabilir veya yapacağınız değişiklikler gelecekte kütüphaneye gelecek güncellemeleri almanızı imkansız kılabilir. Sonuç olarak, uyumsuz iki yapıyı doğrudan birbirine bağlayamazsınız.",[82,117],{},[85,119,121],{"id":120},"çözüm","Çözüm",[11,123,124,125,128],{},"Uyumsuz arayüzleri çözmek için bir ",[43,126,127],{},"Adaptör"," (Adapter) yazabilirsiniz. Bu özel nesne, bir nesnenin arayüzünü değiştirerek diğer nesnenin anlayabileceği bir formata dönüştürür.",[11,130,131],{},"İş yapmak isteyen bir Japon ve bir Alman arasında her iki dili bilen bir tercümanın yaptığı işe benzer bir rol üstlenir. Adaptör, arka tarafta dönen karmaşık dönüştürme işlemlerini gizlemek için nesnelerden birini tamamen sarmalar (wrapper).",[11,133,134],{},"Adaptörlerin çalışma mantığı şu adımlardan oluşur:",[136,137,138,141,144],"ol",{},[50,139,140],{},"İstemci, adaptör tarafından sunulan hedef arayüz (Target) metotlarını çağırır.",[50,142,143],{},"Adaptör, gelen istekleri sarmaladığı uyumsuz nesnenin (Adaptee) anlayabileceği formata çevirir.",[50,145,146],{},"Sonucu tekrar istemcinin beklediği formata dönüştürerek geri döndürür.",[11,148,149],{},[109,150],{"alt":111,"src":151},"\u002Fimages\u002Fadapter-tasarim-deseni-nedir\u002Fadapter-tasarim-kalibi-ornek.avif",[11,153,154],{},"Hisse piyasası uygulamamızda, analitik kütüphanesini kullanabilmek için bir XML-to-JSON adaptörü yazarız. Bu adaptör istemciden XML verisini alır, arka planda JSON formatına dönüştürür ve analiz kütüphanesinin ilgili metotlarına bu JSON verisini besler.",[82,156],{},[85,158,160],{"id":159},"gerçek-hayat-senaryosu-eski-ve-yeni-log-sistemi-entegrasyonu","Gerçek Hayat Senaryosu: Eski ve Yeni Log Sistemi Entegrasyonu",[11,162,163],{},"Yazılım projelerinde sıklıkla eski (legacy) kütüphaneleri yeni tanımlanan modern arayüzlere uydurmak için adaptör yazarız:",[165,166,170],"pre",{"className":167,"code":168,"language":169,"meta":111,"style":111},"language-php shiki shiki-themes github-light github-dark","\u002F\u002F 1. Hedef Arayüz (Target Interface) - Sistemimizin beklediği yeni yapı\ninterface LoggerInterface {\n    public function logInfo(string $message): void;\n}\n\n\u002F\u002F 2. Uyumsuz Sınıf (Adaptee) - Kodunu değiştiremediğimiz eski loglama sınıfı\nclass LegacyLogger {\n    public function writeToDisk(string $text, int $priority): void {\n        echo \"Disk Log ($priority): $text\\n\";\n    }\n}\n\n\u002F\u002F 3. Adaptör Sınıfı (Adapter) - Nesne kompozisyonu kullanarak aradaki uyumu sağlar\nclass LegacyLoggerAdapter implements LoggerInterface {\n    private LegacyLogger $legacyLogger;\n\n    public function __construct(LegacyLogger $legacyLogger) {\n        $this->legacyLogger = $legacyLogger;\n    }\n\n    public function logInfo(string $message): void {\n        \u002F\u002F Eski kütüphanenin metodunu çağırıp parametreleri adapte ediyoruz\n        $this->legacyLogger->writeToDisk($message, 1);\n    }\n}\n","php",[63,171,172,180,186,192,198,205,211,217,223,229,235,240,245,251,257,263,268,274,280,285,290,296,302,308,313],{"__ignoreMap":111},[173,174,177],"span",{"class":175,"line":176},"line",1,[173,178,179],{},"\u002F\u002F 1. Hedef Arayüz (Target Interface) - Sistemimizin beklediği yeni yapı\n",[173,181,183],{"class":175,"line":182},2,[173,184,185],{},"interface LoggerInterface {\n",[173,187,189],{"class":175,"line":188},3,[173,190,191],{},"    public function logInfo(string $message): void;\n",[173,193,195],{"class":175,"line":194},4,[173,196,197],{},"}\n",[173,199,201],{"class":175,"line":200},5,[173,202,204],{"emptyLinePlaceholder":203},true,"\n",[173,206,208],{"class":175,"line":207},6,[173,209,210],{},"\u002F\u002F 2. Uyumsuz Sınıf (Adaptee) - Kodunu değiştiremediğimiz eski loglama sınıfı\n",[173,212,214],{"class":175,"line":213},7,[173,215,216],{},"class LegacyLogger {\n",[173,218,220],{"class":175,"line":219},8,[173,221,222],{},"    public function writeToDisk(string $text, int $priority): void {\n",[173,224,226],{"class":175,"line":225},9,[173,227,228],{},"        echo \"Disk Log ($priority): $text\\n\";\n",[173,230,232],{"class":175,"line":231},10,[173,233,234],{},"    }\n",[173,236,238],{"class":175,"line":237},11,[173,239,197],{},[173,241,243],{"class":175,"line":242},12,[173,244,204],{"emptyLinePlaceholder":203},[173,246,248],{"class":175,"line":247},13,[173,249,250],{},"\u002F\u002F 3. Adaptör Sınıfı (Adapter) - Nesne kompozisyonu kullanarak aradaki uyumu sağlar\n",[173,252,254],{"class":175,"line":253},14,[173,255,256],{},"class LegacyLoggerAdapter implements LoggerInterface {\n",[173,258,260],{"class":175,"line":259},15,[173,261,262],{},"    private LegacyLogger $legacyLogger;\n",[173,264,266],{"class":175,"line":265},16,[173,267,204],{"emptyLinePlaceholder":203},[173,269,271],{"class":175,"line":270},17,[173,272,273],{},"    public function __construct(LegacyLogger $legacyLogger) {\n",[173,275,277],{"class":175,"line":276},18,[173,278,279],{},"        $this->legacyLogger = $legacyLogger;\n",[173,281,283],{"class":175,"line":282},19,[173,284,234],{},[173,286,288],{"class":175,"line":287},20,[173,289,204],{"emptyLinePlaceholder":203},[173,291,293],{"class":175,"line":292},21,[173,294,295],{},"    public function logInfo(string $message): void {\n",[173,297,299],{"class":175,"line":298},22,[173,300,301],{},"        \u002F\u002F Eski kütüphanenin metodunu çağırıp parametreleri adapte ediyoruz\n",[173,303,305],{"class":175,"line":304},23,[173,306,307],{},"        $this->legacyLogger->writeToDisk($message, 1);\n",[173,309,311],{"class":175,"line":310},24,[173,312,234],{},[173,314,316],{"class":175,"line":315},25,[173,317,197],{},[82,319],{},[85,321,323],{"id":322},"adapter-vs-proxy-vs-facade-vs-decorator","Adapter vs Proxy vs Facade vs Decorator",[325,326,327,344],"table",{},[328,329,330],"thead",{},[331,332,333,338,341],"tr",{},[334,335,337],"th",{"align":336},"left","Desen",[334,339,340],{"align":336},"Amaç",[334,342,343],{"align":336},"Arayüz Etkisi",[345,346,347,364,380,397],"tbody",{},[331,348,349,354,357],{},[350,351,352],"td",{"align":336},[43,353,73],{},[350,355,356],{"align":336},"İki uyumsuz yapıyı birleştirmek.",[350,358,359,360,363],{"align":336},"Arayüzü uyumlu bir yeni arayüze ",[43,361,362],{},"dönüştürür",".",[331,365,366,371,374],{},[350,367,368],{"align":336},[43,369,370],{},"Proxy",[350,372,373],{"align":336},"Erişim kontrolü, caching veya gecikmeli yükleme sağlamak.",[350,375,376,377,363],{"align":336},"Arayüzü ",[43,378,379],{},"aynı tutar",[331,381,382,387,390],{},[350,383,384],{"align":336},[43,385,386],{},"Facade",[350,388,389],{"align":336},"Karmaşık alt sistemleri kolay yönetilebilir tek bir kapıdan sunmak.",[350,391,392,393,396],{"align":336},"Sistemi basitleştiren ",[43,394,395],{},"yeni ve sade bir arayüz"," sunar.",[331,398,399,404,407],{},[350,400,401],{"align":336},[43,402,403],{},"Decorator",[350,405,406],{"align":336},"Nesneye dinamik olarak yeni sorumluluklar eklemek.",[350,408,409,410,363],{"align":336},"Arayüzü değiştirmeden ",[43,411,412],{},"genişletir",[82,414],{},[85,416,418],{"id":417},"sınıf-adaptörü-vs-nesne-adaptörü","Sınıf Adaptörü vs Nesne Adaptörü",[11,420,421],{},"Adaptör deseni iki farklı şekilde uygulanabilir:",[423,424,426],"h3",{"id":425},"_1-nesne-adaptörü-object-adapter","1. Nesne Adaptörü (Object Adapter)",[11,428,429,430,432],{},"Kompozisyon (composition) ilkesine dayanır. Adaptör, adapte edilecek nesnenin (",[63,431,69],{},") bir referansını kendi içinde saklar ve onu sarmalar. PHP gibi tekli kalıtım (single inheritance) destekleyen dillerde bu yöntem kullanılır ve en esnek yaklaşımdır.",[423,434,436],{"id":435},"_2-sınıf-adaptörü-class-adapter","2. Sınıf Adaptörü (Class Adapter)",[11,438,439],{},"Kalıtım (inheritance) ilkesine dayanır. Adaptör hem hedef sınıftan hem de adapte edilecek sınıftan aynı anda türetilir (çoklu kalıtım). Python ve C++ gibi çoklu kalıtımı (multiple inheritance) destekleyen dillerde uygulanabilir. Nesneyi sarmalamak yerine doğrudan metotları ezerek çalışır.",[82,441],{},[85,443,445],{"id":444},"uygulanabilirlik","Uygulanabilirlik",[47,447,448,454],{},[50,449,450,453],{},[43,451,452],{},"Uyumsuz Üçüncü Parti Kütüphaneler:"," Mevcut bir sınıfı kullanmak istediğinizde, ancak o sınıfın arayüzü kodunuzun geri kalanıyla doğrudan uyumlu olmadığında ara katman olarak kullanın.",[50,455,456,459],{},[43,457,458],{},"Yeniden Kullanılabilirlik:"," Ortak bir arayüze sahip olmayan veya gelecekte değiştirilmesi muhtemel eski bileşenleri sisteme entegre ederken kullanın.",[82,461],{},[85,463,465],{"id":464},"diğer-tasarım-desenleri-ile-i̇lişkisi","Diğer Tasarım Desenleri ile İlişkisi",[47,467,468,477],{},[50,469,470,473,474,476],{},[43,471,472],{},"Bridge"," tasarım aşamasında soyutlama ile uygulamayı birbirinden ayırmak için (önceden) kurulur. ",[43,475,73],{}," ise mevcut, bitmiş sistemlerin uyumsuzluğunu gidermek için (sonradan) eklenir.",[50,478,479,481,482,484,485,487],{},[43,480,73],{}," sarmaladığı nesne için farklı bir arayüz sunarken, ",[43,483,370],{}," aynı arayüzü korur. ",[43,486,403],{}," ise zenginleştirilmiş\u002Fgeliştirilmiş bir arayüz sağlar.",[82,489],{},[85,491,493],{"id":492},"adapter-tasarım-deseni-kod-örnekleri","Adapter Tasarım Deseni Kod Örnekleri",[423,495,497],{"id":496},"örnek-php-kodu-nesne-adaptörü","Örnek PHP Kodu (Nesne Adaptörü)",[165,499,501],{"className":167,"code":500,"language":169,"meta":111,"style":111},"\u003C?php\n\nnamespace RefactoringGuru\\Adapter\\Conceptual;\n\nclass Target\n{\n    public function request(): string\n    {\n        return \"Target: Varsayılan hedef davranışı.\";\n    }\n}\n\nclass Adaptee\n{\n    public function specificRequest(): string\n    {\n        return \".eetpadA eht fo roivaheb laicepS\";\n    }\n}\n\nclass Adapter extends Target\n{\n    private Adaptee $adaptee;\n\n    public function __construct(Adaptee $adaptee)\n    {\n        $this->adaptee = $adaptee;\n    }\n\n    public function request(): string\n    {\n        \u002F\u002F Gelen ters veriyi düz çevirip istemciye sunuyoruz\n        return \"Adapter: (ÇEVİRİLDİ) \" . strrev($this->adaptee->specificRequest());\n    }\n}\n\nfunction clientCode(Target $target)\n{\n    echo $target->request();\n}\n\necho \"İstemci: Target nesneleri ile sorunsuz çalışabiliyorum:\\n\";\n$target = new Target();\nclientCode($target);\necho \"\\n\\n\";\n\n$adaptee = new Adaptee();\necho \"İstemci: Adaptee sınıfının arayüzü uyumsuz, doğrudan çağıramıyorum:\\n\";\necho \"Adaptee: \" . $adaptee->specificRequest();\necho \"\\n\\n\";\n\necho \"İstemci: Adaptör aracılığıyla çalıştırıyorum:\\n\";\n$adapter = new Adapter($adaptee);\nclientCode($adapter);\n",[63,502,503,508,512,517,521,526,531,536,541,546,550,554,558,563,567,572,576,581,585,589,593,598,602,607,611,616,621,627,632,637,642,647,653,659,664,669,674,680,685,691,696,701,707,713,719,725,730,736,742,748,753,758,764,770],{"__ignoreMap":111},[173,504,505],{"class":175,"line":176},[173,506,507],{},"\u003C?php\n",[173,509,510],{"class":175,"line":182},[173,511,204],{"emptyLinePlaceholder":203},[173,513,514],{"class":175,"line":188},[173,515,516],{},"namespace RefactoringGuru\\Adapter\\Conceptual;\n",[173,518,519],{"class":175,"line":194},[173,520,204],{"emptyLinePlaceholder":203},[173,522,523],{"class":175,"line":200},[173,524,525],{},"class Target\n",[173,527,528],{"class":175,"line":207},[173,529,530],{},"{\n",[173,532,533],{"class":175,"line":213},[173,534,535],{},"    public function request(): string\n",[173,537,538],{"class":175,"line":219},[173,539,540],{},"    {\n",[173,542,543],{"class":175,"line":225},[173,544,545],{},"        return \"Target: Varsayılan hedef davranışı.\";\n",[173,547,548],{"class":175,"line":231},[173,549,234],{},[173,551,552],{"class":175,"line":237},[173,553,197],{},[173,555,556],{"class":175,"line":242},[173,557,204],{"emptyLinePlaceholder":203},[173,559,560],{"class":175,"line":247},[173,561,562],{},"class Adaptee\n",[173,564,565],{"class":175,"line":253},[173,566,530],{},[173,568,569],{"class":175,"line":259},[173,570,571],{},"    public function specificRequest(): string\n",[173,573,574],{"class":175,"line":265},[173,575,540],{},[173,577,578],{"class":175,"line":270},[173,579,580],{},"        return \".eetpadA eht fo roivaheb laicepS\";\n",[173,582,583],{"class":175,"line":276},[173,584,234],{},[173,586,587],{"class":175,"line":282},[173,588,197],{},[173,590,591],{"class":175,"line":287},[173,592,204],{"emptyLinePlaceholder":203},[173,594,595],{"class":175,"line":292},[173,596,597],{},"class Adapter extends Target\n",[173,599,600],{"class":175,"line":298},[173,601,530],{},[173,603,604],{"class":175,"line":304},[173,605,606],{},"    private Adaptee $adaptee;\n",[173,608,609],{"class":175,"line":310},[173,610,204],{"emptyLinePlaceholder":203},[173,612,613],{"class":175,"line":315},[173,614,615],{},"    public function __construct(Adaptee $adaptee)\n",[173,617,619],{"class":175,"line":618},26,[173,620,540],{},[173,622,624],{"class":175,"line":623},27,[173,625,626],{},"        $this->adaptee = $adaptee;\n",[173,628,630],{"class":175,"line":629},28,[173,631,234],{},[173,633,635],{"class":175,"line":634},29,[173,636,204],{"emptyLinePlaceholder":203},[173,638,640],{"class":175,"line":639},30,[173,641,535],{},[173,643,645],{"class":175,"line":644},31,[173,646,540],{},[173,648,650],{"class":175,"line":649},32,[173,651,652],{},"        \u002F\u002F Gelen ters veriyi düz çevirip istemciye sunuyoruz\n",[173,654,656],{"class":175,"line":655},33,[173,657,658],{},"        return \"Adapter: (ÇEVİRİLDİ) \" . strrev($this->adaptee->specificRequest());\n",[173,660,662],{"class":175,"line":661},34,[173,663,234],{},[173,665,667],{"class":175,"line":666},35,[173,668,197],{},[173,670,672],{"class":175,"line":671},36,[173,673,204],{"emptyLinePlaceholder":203},[173,675,677],{"class":175,"line":676},37,[173,678,679],{},"function clientCode(Target $target)\n",[173,681,683],{"class":175,"line":682},38,[173,684,530],{},[173,686,688],{"class":175,"line":687},39,[173,689,690],{},"    echo $target->request();\n",[173,692,694],{"class":175,"line":693},40,[173,695,197],{},[173,697,699],{"class":175,"line":698},41,[173,700,204],{"emptyLinePlaceholder":203},[173,702,704],{"class":175,"line":703},42,[173,705,706],{},"echo \"İstemci: Target nesneleri ile sorunsuz çalışabiliyorum:\\n\";\n",[173,708,710],{"class":175,"line":709},43,[173,711,712],{},"$target = new Target();\n",[173,714,716],{"class":175,"line":715},44,[173,717,718],{},"clientCode($target);\n",[173,720,722],{"class":175,"line":721},45,[173,723,724],{},"echo \"\\n\\n\";\n",[173,726,728],{"class":175,"line":727},46,[173,729,204],{"emptyLinePlaceholder":203},[173,731,733],{"class":175,"line":732},47,[173,734,735],{},"$adaptee = new Adaptee();\n",[173,737,739],{"class":175,"line":738},48,[173,740,741],{},"echo \"İstemci: Adaptee sınıfının arayüzü uyumsuz, doğrudan çağıramıyorum:\\n\";\n",[173,743,745],{"class":175,"line":744},49,[173,746,747],{},"echo \"Adaptee: \" . $adaptee->specificRequest();\n",[173,749,751],{"class":175,"line":750},50,[173,752,724],{},[173,754,756],{"class":175,"line":755},51,[173,757,204],{"emptyLinePlaceholder":203},[173,759,761],{"class":175,"line":760},52,[173,762,763],{},"echo \"İstemci: Adaptör aracılığıyla çalıştırıyorum:\\n\";\n",[173,765,767],{"class":175,"line":766},53,[173,768,769],{},"$adapter = new Adapter($adaptee);\n",[173,771,773],{"class":175,"line":772},54,[173,774,775],{},"clientCode($adapter);\n",[423,777,779],{"id":778},"örnek-python-kodu-sınıf-adaptörü-çoklu-kalıtım","Örnek Python Kodu (Sınıf Adaptörü - Çoklu Kalıtım)",[165,781,785],{"className":782,"code":783,"language":784,"meta":111,"style":111},"language-python shiki shiki-themes github-light github-dark","class Target:\n    def request(self) -> str:\n        return \"Target: Varsayılan hedef davranışı.\"\n\nclass Adaptee:\n    def specific_request(self) -> str:\n        return \".eetpadA eht fo roivaheb laicepS\"\n\nclass Adapter(Target, Adaptee):\n    # Çoklu kalıtım ile her iki sınıfın da yeteneklerini devralıyoruz\n    def request(self) -> str:\n        return f\"Adapter: (ÇEVİRİLDİ) {self.specific_request()[::-1]}\"\n\ndef client_code(target: Target) -> None:\n    print(target.request(), end=\"\")\n\nif __name__ == \"__main__\":\n    print(\"İstemci: Target nesneleri ile çalışıyorum:\")\n    target = Target()\n    client_code(target)\n    print(\"\\n\")\n\n    adaptee = Adaptee()\n    print(\"İstemci: Adaptee uyumsuz arayüze sahip:\")\n    print(f\"Adaptee: {adaptee.specific_request()}\", end=\"\\n\\n\")\n\n    print(\"İstemci: Çoklu kalıtım tabanlı Sınıf Adaptörü ile çalıştırıyorum:\")\n    adapter = Adapter()\n    client_code(adapter)\n","python",[63,786,787,792,797,802,806,811,816,821,825,830,835,839,844,848,853,858,862,867,872,877,882,887,891,896,901,906,910,915,920],{"__ignoreMap":111},[173,788,789],{"class":175,"line":176},[173,790,791],{},"class Target:\n",[173,793,794],{"class":175,"line":182},[173,795,796],{},"    def request(self) -> str:\n",[173,798,799],{"class":175,"line":188},[173,800,801],{},"        return \"Target: Varsayılan hedef davranışı.\"\n",[173,803,804],{"class":175,"line":194},[173,805,204],{"emptyLinePlaceholder":203},[173,807,808],{"class":175,"line":200},[173,809,810],{},"class Adaptee:\n",[173,812,813],{"class":175,"line":207},[173,814,815],{},"    def specific_request(self) -> str:\n",[173,817,818],{"class":175,"line":213},[173,819,820],{},"        return \".eetpadA eht fo roivaheb laicepS\"\n",[173,822,823],{"class":175,"line":219},[173,824,204],{"emptyLinePlaceholder":203},[173,826,827],{"class":175,"line":225},[173,828,829],{},"class Adapter(Target, Adaptee):\n",[173,831,832],{"class":175,"line":231},[173,833,834],{},"    # Çoklu kalıtım ile her iki sınıfın da yeteneklerini devralıyoruz\n",[173,836,837],{"class":175,"line":237},[173,838,796],{},[173,840,841],{"class":175,"line":242},[173,842,843],{},"        return f\"Adapter: (ÇEVİRİLDİ) {self.specific_request()[::-1]}\"\n",[173,845,846],{"class":175,"line":247},[173,847,204],{"emptyLinePlaceholder":203},[173,849,850],{"class":175,"line":253},[173,851,852],{},"def client_code(target: Target) -> None:\n",[173,854,855],{"class":175,"line":259},[173,856,857],{},"    print(target.request(), end=\"\")\n",[173,859,860],{"class":175,"line":265},[173,861,204],{"emptyLinePlaceholder":203},[173,863,864],{"class":175,"line":270},[173,865,866],{},"if __name__ == \"__main__\":\n",[173,868,869],{"class":175,"line":276},[173,870,871],{},"    print(\"İstemci: Target nesneleri ile çalışıyorum:\")\n",[173,873,874],{"class":175,"line":282},[173,875,876],{},"    target = Target()\n",[173,878,879],{"class":175,"line":287},[173,880,881],{},"    client_code(target)\n",[173,883,884],{"class":175,"line":292},[173,885,886],{},"    print(\"\\n\")\n",[173,888,889],{"class":175,"line":298},[173,890,204],{"emptyLinePlaceholder":203},[173,892,893],{"class":175,"line":304},[173,894,895],{},"    adaptee = Adaptee()\n",[173,897,898],{"class":175,"line":310},[173,899,900],{},"    print(\"İstemci: Adaptee uyumsuz arayüze sahip:\")\n",[173,902,903],{"class":175,"line":315},[173,904,905],{},"    print(f\"Adaptee: {adaptee.specific_request()}\", end=\"\\n\\n\")\n",[173,907,908],{"class":175,"line":618},[173,909,204],{"emptyLinePlaceholder":203},[173,911,912],{"class":175,"line":623},[173,913,914],{},"    print(\"İstemci: Çoklu kalıtım tabanlı Sınıf Adaptörü ile çalıştırıyorum:\")\n",[173,916,917],{"class":175,"line":629},[173,918,919],{},"    adapter = Adapter()\n",[173,921,922],{"class":175,"line":634},[173,923,924],{},"    client_code(adapter)\n",[82,926],{},[85,928,930],{"id":929},"sıkça-sorulan-sorular-faq","Sıkça Sorulan Sorular (FAQ)",[423,932,934],{"id":933},"sınıf-adaptörü-class-adapter-ile-nesne-adaptörü-object-adapter-arasındaki-fark-nedir","Sınıf Adaptörü (Class Adapter) ile Nesne Adaptörü (Object Adapter) arasındaki fark nedir?",[47,936,937,943],{},[50,938,939,942],{},[43,940,941],{},"Sınıf Adaptörü:"," Kalıtım kullanır. Adaptee'yi miras aldığı için onun tüm protected ve public metotlarına doğrudan erişebilir. Çoklu kalıtım gerektirir.",[50,944,945,948],{},[43,946,947],{},"Nesne Adaptörü:"," Kompozisyon kullanır. Adaptee nesnesini constructor üzerinden referans olarak alır. Çoklu kalıtım gerektirmediği için tüm OOP dillerinde çalışır ve runtime sırasında farklı adaptee nesneleriyle eşleşebilir.",[423,950,952],{"id":951},"adapter-deseni-single-responsibility-principle-srp-ile-nasıl-uyuşur","Adapter deseni Single Responsibility Principle (SRP) ile nasıl uyuşur?",[11,954,955],{},"Sisteminizin ana iş mantığı ile verilerin farklı kütüphanelerin formatına (JSON, XML vb.) dönüştürülme sorumluluğu birbirinden ayrılır. Tüm dönüştürme işi sadece adaptör sınıfına verilir, böylece ana kodunuz temiz kalır.",[423,957,959],{"id":958},"i̇ki-yönlü-adaptör-two-way-adapter-nedir","İki Yönlü Adaptör (Two-way Adapter) nedir?",[11,961,962,963,965,966,968,969,965,971,973],{},"Hem ",[63,964,65],{}," arayüzünü ",[63,967,69],{}," arayüzüne, hem de tam tersi ",[63,970,69],{},[63,972,65],{}," arayüzüne dönüştürebilen çift taraflı çalışan adaptörlerdir. Genellikle her iki sınıfın da arayüzünü uygulayarak yazılır.",[82,975],{},[85,977,979],{"id":978},"diğer-tasarım-kalıplarıdesign-patterns","Diğer Tasarım Kalıpları\u002FDesign Patterns",[11,981,982],{},[43,983,984],{},"Oluşumsal Kalıplar (Creational Patterns)",[11,986,987,991,992,991,996,991,1000,991,1004],{},[15,988,990],{"href":989},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-factory-method-nedir","Factory Method",",\n",[15,993,995],{"href":994},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-abstract-factory-nedir","Abstract Factory",[15,997,999],{"href":998},"\u002Ftr\u002Fbuilder-tasarim-deseni-nedir","Builder",[15,1001,1003],{"href":1002},"\u002Ftr\u002Fprototype-tasarim-deseni-nedir","Prototype",[15,1005,1007],{"href":1006},"\u002Ftr\u002Fsingleton-tasarim-deseni-nedir","Singleton",[11,1009,1010],{},[43,1011,1012],{},"Yapısal Kalıplar (Structural Patterns)",[11,1014,1015,991,1018,991,1021,991,1025,991,1028,991,1031,991,1035],{},[15,1016,73],{"href":1017},"\u002Ftr\u002Fadapter-tasarim-deseni-nedir",[15,1019,472],{"href":1020},"\u002Ftr\u002Fbridge-tasarim-deseni-nedir",[15,1022,1024],{"href":1023},"\u002Ftr\u002Fcomposite-tasarim-deseni-nedir","Composite",[15,1026,403],{"href":1027},"\u002Ftr\u002Fdecorator-tasarim-deseni-nedir",[15,1029,386],{"href":1030},"\u002Ftr\u002Ffacade-tasarim-deseni-nedir",[15,1032,1034],{"href":1033},"\u002Ftr\u002Fflyweight-tasarim-deseni-nedir","Flyweight",[15,1036,370],{"href":1037},"\u002Ftr\u002Fproxy-tasarim-deseni-nedir",[11,1039,1040],{},[43,1041,1042],{},"Davranışsal Kalıplar (Behavioral Patterns)",[11,1044,1045,991,1049,991,1053,991,1057,991,1061,991,1065,991,1069,991,1073,991,1077,991,1081],{},[15,1046,1048],{"href":1047},"\u002Ftr\u002Fchain-of-responsibility-deseni-nedir","Chain of Responsibility",[15,1050,1052],{"href":1051},"\u002Ftr\u002Fcommand-tasarim-deseni-nedir","Command",[15,1054,1056],{"href":1055},"\u002Ftr\u002Fiterator-tasarim-deseni-nedir","Iterator",[15,1058,1060],{"href":1059},"\u002Ftr\u002Fmediator-tasarim-deseni-nedir","Mediator",[15,1062,1064],{"href":1063},"\u002Ftr\u002Fmemento-tasarim-deseni-nedir","Memento",[15,1066,1068],{"href":1067},"\u002Ftr\u002Fobserver-tasarim-deseni-nedir","Observer",[15,1070,1072],{"href":1071},"\u002Ftr\u002Fstate-tasarim-deseni-nedir","State",[15,1074,1076],{"href":1075},"\u002Ftr\u002Fstrategy-tasarim-deseni-nedir","Strategy",[15,1078,1080],{"href":1079},"\u002Ftr\u002Ftemplate-method-tasarim-deseni-nedir","Template Method",[15,1082,1084],{"href":1083},"\u002Ftr\u002Fvisitor-tasarim-deseni-nedir","Visitor",[1086,1087,1088],"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":111,"searchDepth":182,"depth":182,"links":1090},[1091,1092,1093,1094,1095,1096,1100,1101,1102,1106,1111],{"id":87,"depth":182,"text":88},{"id":98,"depth":182,"text":99},{"id":120,"depth":182,"text":121},{"id":159,"depth":182,"text":160},{"id":322,"depth":182,"text":323},{"id":417,"depth":182,"text":418,"children":1097},[1098,1099],{"id":425,"depth":188,"text":426},{"id":435,"depth":188,"text":436},{"id":444,"depth":182,"text":445},{"id":464,"depth":182,"text":465},{"id":492,"depth":182,"text":493,"children":1103},[1104,1105],{"id":496,"depth":188,"text":497},{"id":778,"depth":188,"text":779},{"id":929,"depth":182,"text":930,"children":1107},[1108,1109,1110],{"id":933,"depth":188,"text":934},{"id":951,"depth":188,"text":952},{"id":958,"depth":188,"text":959},{"id":978,"depth":182,"text":979},[1113],"technical",null,"2021-08-21","Adapter (Adaptör) tasarım kalıbını, sınıf ve nesne adaptörleri arasındaki farkları, log entegrasyonu senaryolarını ve PHP\u002FPython örneklerini öğrenin.",false,"md","\u002Fimages\u002Fposts\u002F2021\u002F08\u002Fadapter-tasarim-deseni.avif",{},{"title":6,"description":1116},"adapter-tasarim-deseni-nedir","tr\u002Fadapter-tasarim-deseni-nedir",[1125,1126,1127,1128],"design-patterns","ipucu","tasarim-desenleri","tasarim-kaliplari","9sRC1ZxPnGOVvnSdokRn7RDGTj8FL0eqji2oL_jQuAQ",{"prev":1131,"next":1133,"others":1136,"lucky":1247,"readingTime":207},{"path":1020,"title":1132},"Bridge Tasarım Deseni Nedir?",{"path":1134,"title":1135},"\u002Ftr\u002Fmutable-ve-immutable-kavrami","Mutable ve Immutable Kavramları Nedir?",[1137,1140,1143,1145,1148,1151,1154,1157,1160,1163,1166,1168,1171,1174,1177,1179,1182,1185,1187,1190,1193,1196,1198,1201,1203,1206,1209,1212,1214,1217,1219,1222,1225,1227,1230,1233,1236,1239,1242,1245],{"path":1138,"title":1139},"\u002Ftr\u002Flinuxda-golang-kurulumu","Linux'ta Golang Kurulumu",{"path":1141,"title":1142},"\u002Ftr\u002Fheadless-wordpress-hakkinda-her-sey","Headless WordPress Hakkında Her Şey",{"path":1083,"title":1144},"Visitor Tasarım Deseni Nedir?",{"path":1146,"title":1147},"\u002Ftr\u002Ftemiz-moduler-ve-yeniden-kullanilabilir-php-kodu-yazma-rehberi","PHP'de Temiz, Modüler ve Yeniden Kullanılabilir Kod Yazma Rehberi",{"path":1149,"title":1150},"\u002Ftr\u002Fes15-nedir-ecmascript-2024-nedir","ES15 nedir? ECMAScript 2024 nedir?",{"path":1152,"title":1153},"\u002Ftr\u002Fgo-ve-degiskenler","Go ve Değişkenler",{"path":1155,"title":1156},"\u002Ftr\u002Fes6-nedir-ecmascript-2015-nedir","ES6 Nedir? ECMAScript 2015 Nedir?",{"path":1158,"title":1159},"\u002Ftr\u002Fes5-nedir","ES5 Nedir? JavaScript Geliştiricileri İçin Kılavuz",{"path":1161,"title":1162},"\u002Ftr\u002Fphp-ve-makine-ogrenimi-php-ml-kutuphanesi","PHP ve Makine Öğrenimi: PHP-ML Kütüphanesi ile Pratik Çözümler",{"path":1164,"title":1165},"\u002Ftr\u002Fwindows-10-golang-kurulumu","Windows 10 ve 11'de Golang Kurulumu ve GOPATH Yapılandırması",{"path":1023,"title":1167},"Composite Tasarım Deseni Nedir?",{"path":1169,"title":1170},"\u002Ftr\u002Fgo-programlama-dilinin-ozellikleri","Go Programlama Dilinin Özellikleri",{"path":1172,"title":1173},"\u002Ftr\u002Fphp-generator-ve-iterator-farki","PHP'de Generator ve Iterator Arasındaki Temel Farklar",{"path":1175,"title":1176},"\u002Ftr\u002Fwsl-2-kurulumu-6-kolay-adim","WSL 2 Kurulumu - 6 kolay adım",{"path":1063,"title":1178},"Memento Tasarım Deseni Nedir?",{"path":1180,"title":1181},"\u002Ftr\u002Fes14-nedir-ecmascript-2023-nedir","ES14 nedir? ECMAScript 2023 nedir?",{"path":1183,"title":1184},"\u002Ftr\u002Fes10-nedir-ecmascript-2019-nedir","ES10 Nedir? ECMAScript 2019 Nedir?",{"path":1027,"title":1186},"Decorator Tasarım Deseni Nedir?",{"path":1188,"title":1189},"\u002Ftr\u002Fgarbage-collection-ve-golang","Garbage Collection ve Go (Golang)",{"path":1191,"title":1192},"\u002Ftr\u002Fgo-veri-tipleri-map","Go Veri Tipleri - Map",{"path":1194,"title":1195},"\u002Ftr\u002Fes16-nedir-ecmascript-2025-nedir","ES16 nedir? ECMAScript 2025 nedir?",{"path":1067,"title":1197},"Observer Tasarım Deseni Nedir?",{"path":1199,"title":1200},"\u002Ftr\u002Fes7-nedir-ecmascript-2016-nedir","ES7 Nedir? ECMAScript 2016 Nedir?",{"path":1075,"title":1202},"Strategy Tasarım Deseni Nedir?",{"path":1204,"title":1205},"\u002Ftr\u002Fgoda-iota-nedir-iota-ne-zaman-ve-nerede-kullanilir","Go'da iota Nedir? iota Ne Zaman ve Nerede Kullanılır?",{"path":1207,"title":1208},"\u002Ftr\u002Fgo-slice-veri-tipi","Go Veri Tipleri: Slice",{"path":1210,"title":1211},"\u002Ftr\u002Fopenlitespeed-ve-litespeed-enterprisei-reverse-proxy-olarak-kullanmak","OpenLiteSpeed ve LiteSpeed Enterprise Sunucularını Reverse Proxy Olarak Kullanmak",{"path":1030,"title":1213},"Facade Tasarım Deseni Nedir?",{"path":1215,"title":1216},"\u002Ftr\u002Fes13-nedir-ecmascript-2022-nedir","ES13 nedir? ECMAScript 2022 nedir?",{"path":1059,"title":1218},"Mediator Tasarım Deseni Nedir?",{"path":1220,"title":1221},"\u002Ftr\u002Fearly-return-erken-donus-nedir","Early Return \u002F Erken Dönüş nedir?",{"path":1223,"title":1224},"\u002Ftr\u002Fgo-veri-tipleri-struct","Go Veri Tipleri: Struct",{"path":1047,"title":1226},"Chain of Responsibility Deseni Nedir?",{"path":1228,"title":1229},"\u002Ftr\u002Fnext-js-on-bellegi-nasil-yenilenir-on-demand-cache-regeneration","Next.js Önbelleği Nasıl Yenilenir? \"On-Demand Cache Regeneration\"",{"path":1231,"title":1232},"\u002Ftr\u002Fecmascript-nedir-ecmascript-ne-degildir-bilinmesi-gerekenler","ECMAScript Nedir? Bilinmesi Gerekenler...",{"path":1234,"title":1235},"\u002Ftr\u002Ftricolor-garbage-collection-algoritmasi-nedir","Tricolor Garbage Collection Algoritması Nedir?",{"path":1237,"title":1238},"\u002Ftr\u002Fes9-nedir-ecmascript-2018-nedir","ES9 Nedir? ECMAScript 2018 Nedir?",{"path":1240,"title":1241},"\u002Ftr\u002Fubuntu-24-04-uzerinde-cyberpanel-kurulumu","Ubuntu 24.04 LTS ve 22.04 LTS Üzerinde CyberPanel Kurulumu",{"path":1243,"title":1244},"\u002Ftr\u002Fvite-nedir","Vite Nedir? Modern Web Geliştirme ve Paketleme Aracı",{"path":1051,"title":1246},"Command Tasarım Deseni Nedir?",{"path":1063,"title":1178},[1249,1252,1255,1258],{"path":998,"title":1250,"date":1251},"Builder Tasarım Deseni Nedir?","2021-08-03",{"path":17,"title":1253,"date":1254},"Design Patterns \u002F Tasarım Desenleri nedir?","2021-07-24",{"path":994,"title":1256,"date":1257},"Abstract Factory Tasarım Deseni Nedir?","2021-07-27",{"path":989,"title":1259,"date":1254},"Factory Method Tasarım Deseni Nedir?",[1261,1265,1269],{"path":1262,"title":1263,"date":1264},"\u002Ftr\u002Fjwt-guvenli-mi-guvenlik-acigi-olusturmayin","JWT Güvenli Derken Güvenlik Açığı Oluşturmayın","2021-01-08",{"path":1266,"title":1267,"date":1268},"\u002Ftr\u002Fes17-nedir-ecmascript-2026-nedir","ES17 nedir? ECMAScript 2026 nedir?","2026-06-20",{"path":1158,"title":1159,"date":1270},"2021-10-20",1782142065593]