[{"data":1,"prerenderedAt":1419},["ShallowReactive",2],{"post-\u002Ftr\u002Fproxy-tasarim-deseni-nedir":3},{"page":4,"translation":1262,"nav":1276,"related":1397,"random":1407},{"id":5,"title":6,"body":7,"categories":1260,"category":1262,"date":1263,"description":1264,"draft":1265,"extension":1266,"image":1267,"kind":1262,"lang":375,"meta":1268,"navigation":194,"path":1189,"readingTime":198,"seo":1269,"slug":1270,"stem":1271,"tags":1272,"translationKey":1262,"type":1261,"updated":1262,"__hash__":1275},"postsTr\u002Ftr\u002Fproxy-tasarim-deseni-nedir.md","Proxy Tasarım Deseni Nedir?",{"type":8,"value":9,"toc":1241},"minimark",[10,20,33,36,86,89,94,99,101,105,108,115,118,121,123,127,133,139,142,145,147,151,154,362,364,368,476,478,482,485,517,519,523,549,551,555,560,861,865,1076,1078,1082,1086,1104,1108,1118,1122,1125,1127,1131,1136,1159,1164,1190,1195,1237],[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ç:"," Başka bir nesne için yer tutucu veya vekil sağlayarak o nesneye erişimi kontrol etmeyi sağlar. İstek gerçek nesneye ulaşmadan önce veya sonra ek işlemler (yetkilendirme, önbellekleme, loglama vb.) yapılabilmesine izin verir.",[50,57,58,61,62,66,67,70,71,74],{},[43,59,60],{},"Kilit Yapılar:"," Ortak Arayüz (",[63,64,65],"code",{},"Subject","), Gerçek Nesne (",[63,68,69],{},"RealSubject",") ve Vekil Nesnesi (",[63,72,73],{},"Proxy",").",[50,76,77,80,81,85],{},[43,78,79],{},"Motto:"," ",[82,83,84],"em",{},"Control and Cache"," (Erişimi denetle ve önbelleğe al).",[87,88],"hr",{},[90,91,93],"h2",{"id":92},"proxy-tasarım-deseninin-amacı","Proxy Tasarım Deseninin Amacı",[11,95,96,98],{},[43,97,73],{}," (Vekil \u002F Temsilci), başka bir nesne için bir yedek veya yer tutucu sağlamanıza olanak tanıyan yapısal (structural) bir tasarım desenidir. Bir proxy, orijinal nesneye erişimi kontrol ederek, istek orijinal nesneye ulaşmadan önce veya sonra ek işlemler gerçekleştirmenize izin verir.",[87,100],{},[90,102,104],{"id":103},"sorun","Sorun",[11,106,107],{},"Çok büyük miktarda sistem kaynağı tüketen devasa bir nesneniz olduğunu düşünün. Bu nesneye her zaman değil, sadece belirli zamanlarda ihtiyaç duyuyorsunuz.",[11,109,110],{},[111,112],"img",{"alt":113,"src":114},"Proxy tasarım deseni nedir?","\u002Fimages\u002Fproxy-tasarim-deseni-nedir\u002Fproxy-tasarim-deseni-nedir.avif",[11,116,117],{},"Veritabanı veya API sorgularını doğrudan tetiklemek yavaş ve maliyetli olabilir. Nesneyi uygulama açıldığında değil, sadece ihtiyaç duyulduğunda oluşturmak için Tembel Başlatma (Lazy Initialization) yöntemi uygulanabilir.",[11,119,120],{},"Ancak bu kodu doğrudan nesneyi kullanan tüm istemcilere yazmak ciddi kod tekrarına neden olur. Kodunu değiştiremediğimiz üçüncü parti kapalı bir kütüphane söz konusu olduğunda ise bu yaklaşım tamamen imkansızlaşır.",[87,122],{},[90,124,126],{"id":125},"çözüm","Çözüm",[11,128,129,132],{},[43,130,131],{},"Proxy deseni",", orijinal servis nesnesiyle birebir aynı arayüze (interface) sahip yeni bir ara sınıf (Proxy sınıfı) oluşturmanızı önerir. İstemciler doğrudan gerçek nesneye değil, bu proxy nesnesine istek gönderir. Proxy nesnesi isteği aldığında, gerçek servis nesnesini arka planda başlatır ve işi ona devreder.",[11,134,135],{},[111,136],{"alt":137,"src":138},"Proxy tasarım deseni nasıl kullanılır?","\u002Fimages\u002Fproxy-tasarim-deseni-nedir\u002Fneden-proxy-tasarim-deseni.avif",[11,140,141],{},"Proxy, istemcinin veya gerçek veritabanı nesnesinin haberi olmadan tembel başlatmayı (lazy initialization) yürütür ve gelen sonuçları önbelleğe alır.",[11,143,144],{},"Orijinal sınıfla aynı arayüze sahip olduğu için, istemciler gerçek servis nesnesi yerine proxy nesnesiyle çalıştıklarını fark etmezler bile. Bu sayede ana iş mantığı koduna dokunmadan araya ek yetenekler entegre edilmiş olur.",[87,146],{},[90,148,150],{"id":149},"gerçek-hayat-senaryosu-youtube-api-i̇steklerini-önbelleğe-alma-caching-proxy","Gerçek Hayat Senaryosu: YouTube API İsteklerini Önbelleğe Alma (Caching Proxy)",[11,152,153],{},"API isteklerinin maliyetini azaltmak ve hızı artırmak amacıyla Caching Proxy şu şekilde kurgulanabilir:",[155,156,161],"pre",{"className":157,"code":158,"language":159,"meta":160,"style":160},"language-php shiki shiki-themes github-light github-dark","\u002F\u002F 1. Ortak Arayüz (Subject)\ninterface YouTubeServiceInterface {\n    public function downloadVideo(string $id): string;\n}\n\n\u002F\u002F 2. Gerçek Servis (RealSubject)\nclass ThirdPartyYouTubeClass implements YouTubeServiceInterface {\n    public function downloadVideo(string $id): string {\n        \u002F\u002F Gerçek API'den veri indirme simülasyonu (yavaş işlem)\n        sleep(2);\n        return \"Video verisi ($id)\";\n    }\n}\n\n\u002F\u002F 3. Vekil Sınıf (Proxy)\nclass CachedYouTubeProxy implements YouTubeServiceInterface {\n    private ThirdPartyYouTubeClass $service;\n    private array $cache = [];\n\n    public function __construct(ThirdPartyYouTubeClass $service) {\n        $this->service = $service;\n    }\n\n    public function downloadVideo(string $id): string {\n        \u002F\u002F Önbellek kontrolü yapılıyor\n        if (!isset($this->cache[$id])) {\n            echo \"Önbellekte bulunamadı. API'ye gidiliyor...\\n\";\n            $this->cache[$id] = $this->service->downloadVideo($id);\n        } else {\n            echo \"Video önbellekten getirildi!\\n\";\n        }\n        return $this->cache[$id];\n    }\n}\n","php","",[63,162,163,171,177,183,189,196,202,208,214,220,226,232,238,243,248,254,260,266,272,277,283,289,294,299,304,310,316,322,328,334,340,346,352,357],{"__ignoreMap":160},[164,165,168],"span",{"class":166,"line":167},"line",1,[164,169,170],{},"\u002F\u002F 1. Ortak Arayüz (Subject)\n",[164,172,174],{"class":166,"line":173},2,[164,175,176],{},"interface YouTubeServiceInterface {\n",[164,178,180],{"class":166,"line":179},3,[164,181,182],{},"    public function downloadVideo(string $id): string;\n",[164,184,186],{"class":166,"line":185},4,[164,187,188],{},"}\n",[164,190,192],{"class":166,"line":191},5,[164,193,195],{"emptyLinePlaceholder":194},true,"\n",[164,197,199],{"class":166,"line":198},6,[164,200,201],{},"\u002F\u002F 2. Gerçek Servis (RealSubject)\n",[164,203,205],{"class":166,"line":204},7,[164,206,207],{},"class ThirdPartyYouTubeClass implements YouTubeServiceInterface {\n",[164,209,211],{"class":166,"line":210},8,[164,212,213],{},"    public function downloadVideo(string $id): string {\n",[164,215,217],{"class":166,"line":216},9,[164,218,219],{},"        \u002F\u002F Gerçek API'den veri indirme simülasyonu (yavaş işlem)\n",[164,221,223],{"class":166,"line":222},10,[164,224,225],{},"        sleep(2);\n",[164,227,229],{"class":166,"line":228},11,[164,230,231],{},"        return \"Video verisi ($id)\";\n",[164,233,235],{"class":166,"line":234},12,[164,236,237],{},"    }\n",[164,239,241],{"class":166,"line":240},13,[164,242,188],{},[164,244,246],{"class":166,"line":245},14,[164,247,195],{"emptyLinePlaceholder":194},[164,249,251],{"class":166,"line":250},15,[164,252,253],{},"\u002F\u002F 3. Vekil Sınıf (Proxy)\n",[164,255,257],{"class":166,"line":256},16,[164,258,259],{},"class CachedYouTubeProxy implements YouTubeServiceInterface {\n",[164,261,263],{"class":166,"line":262},17,[164,264,265],{},"    private ThirdPartyYouTubeClass $service;\n",[164,267,269],{"class":166,"line":268},18,[164,270,271],{},"    private array $cache = [];\n",[164,273,275],{"class":166,"line":274},19,[164,276,195],{"emptyLinePlaceholder":194},[164,278,280],{"class":166,"line":279},20,[164,281,282],{},"    public function __construct(ThirdPartyYouTubeClass $service) {\n",[164,284,286],{"class":166,"line":285},21,[164,287,288],{},"        $this->service = $service;\n",[164,290,292],{"class":166,"line":291},22,[164,293,237],{},[164,295,297],{"class":166,"line":296},23,[164,298,195],{"emptyLinePlaceholder":194},[164,300,302],{"class":166,"line":301},24,[164,303,213],{},[164,305,307],{"class":166,"line":306},25,[164,308,309],{},"        \u002F\u002F Önbellek kontrolü yapılıyor\n",[164,311,313],{"class":166,"line":312},26,[164,314,315],{},"        if (!isset($this->cache[$id])) {\n",[164,317,319],{"class":166,"line":318},27,[164,320,321],{},"            echo \"Önbellekte bulunamadı. API'ye gidiliyor...\\n\";\n",[164,323,325],{"class":166,"line":324},28,[164,326,327],{},"            $this->cache[$id] = $this->service->downloadVideo($id);\n",[164,329,331],{"class":166,"line":330},29,[164,332,333],{},"        } else {\n",[164,335,337],{"class":166,"line":336},30,[164,338,339],{},"            echo \"Video önbellekten getirildi!\\n\";\n",[164,341,343],{"class":166,"line":342},31,[164,344,345],{},"        }\n",[164,347,349],{"class":166,"line":348},32,[164,350,351],{},"        return $this->cache[$id];\n",[164,353,355],{"class":166,"line":354},33,[164,356,237],{},[164,358,360],{"class":166,"line":359},34,[164,361,188],{},[87,363],{},[90,365,367],{"id":366},"proxy-vs-decorator-vs-adapter-vs-facade","Proxy vs Decorator vs Adapter vs Facade",[369,370,371,391],"table",{},[372,373,374],"thead",{},[375,376,377,382,385,388],"tr",{},[378,379,381],"th",{"align":380},"left","Desen",[378,383,384],{"align":380},"Amaç",[378,386,387],{"align":380},"Arayüz Etkisi",[378,389,390],{"align":380},"Yaşam Döngüsü",[392,393,394,417,439,457],"tbody",{},[375,395,396,401,404,411],{},[397,398,399],"td",{"align":380},[43,400,73],{},[397,402,403],{"align":380},"Erişim kontrolü, caching, tembel yükleme.",[397,405,406,407,410],{"align":380},"Arayüzü ",[43,408,409],{},"aynı tutar",".",[397,412,413,414,410],{"align":380},"Gerçek nesnenin yaşam döngüsünü ",[43,415,416],{},"kendisi yönetir",[375,418,419,424,427,433],{},[397,420,421],{"align":380},[43,422,423],{},"Decorator",[397,425,426],{"align":380},"Dinamik olarak nesneye yeni yetenekler eklemek.",[397,428,429,430,410],{"align":380},"Arayüzü değiştirmeden ",[43,431,432],{},"genişletir",[397,434,435,436,410],{"align":380},"Sarmalanan nesne dışarıdan ",[43,437,438],{},"istemci tarafından verilir",[375,440,441,446,449,454],{},[397,442,443],{"align":380},[43,444,445],{},"Adapter",[397,447,448],{"align":380},"Uyumsuz sistemleri birleştirmek.",[397,450,406,451,410],{"align":380},[43,452,453],{},"değiştirir",[397,455,456],{"align":380},"Genelde sadece tek nesneyi sarar.",[375,458,459,464,467,473],{},[397,460,461],{"align":380},[43,462,463],{},"Facade",[397,465,466],{"align":380},"Karmaşık bir alt sistemi basitleştirmek.",[397,468,469,472],{"align":380},[43,470,471],{},"Yeni ve sade bir arayüz"," sunar.",[397,474,475],{"align":380},"Alt sistemdeki birçok nesneyi yönetir.",[87,477],{},[90,479,481],{"id":480},"uygulanabilirlik","Uygulanabilirlik",[11,483,484],{},"Proxy deseninin en popüler kullanım alanları şunlardır:",[47,486,487,493,499,505,511],{},[50,488,489,492],{},[43,490,491],{},"Sanal Proxy (Virtual Proxy):"," Yoğun sistem kaynağı tüketen ağır bir nesnenin oluşturulmasını gerçekten kullanılacağı ana kadar ötelemek (Lazy Initialization) istediğinizde kullanın.",[50,494,495,498],{},[43,496,497],{},"Koruma Proxy'si (Protection Proxy):"," Nesnelere yetkilendirme katmanı eklemek ve sadece belirli haklara sahip istemcilerin servis nesnesini çağırmasına izin vermek istediğinizde kullanın.",[50,500,501,504],{},[43,502,503],{},"Uzak Proxy (Remote Proxy):"," Gerçek nesne başka bir sunucuda veya ağın ucunda olduğunda, ağ bağlantı detaylarını gizleyen yerel bir temsilci sağlamak için kullanın.",[50,506,507,510],{},[43,508,509],{},"Önbellek Proxy'si (Caching Proxy):"," Pahalı veritabanı veya API sorgularının sonuçlarını önbelleğe alıp istemciye hızlı dönmek istediğinizde kullanın.",[50,512,513,516],{},[43,514,515],{},"Loglama Proxy'si (Logging Proxy):"," Gerçek nesneye yapılan istekleri loglamak istediğinizde kullanın.",[87,518],{},[90,520,522],{"id":521},"diğer-tasarım-desenleri-ile-i̇lişkisi","Diğer Tasarım Desenleri ile İlişkisi",[47,524,525,536,541],{},[50,526,527,529,530,532,533,535],{},[43,528,445],{}," nesnenin arayüzünü değiştirirken, ",[43,531,423],{}," nesneyi arayüzünü değiştirmeden genişletir. ",[43,534,73],{}," ise nesneye aynı arayüzle erişim kontrolü sağlar.",[50,537,538,540],{},[43,539,463],{},", karmaşık bir sistemi basitleştiren bir ara tampon olması yönüyle Proxy'ye benzer. Ancak Proxy, servis nesnesiyle birebir aynı arayüze sahip olduğu için onun yerine doğrudan geçebilir.",[50,542,543,545,546,548],{},[43,544,423],{}," ve ",[43,547,73],{}," benzer yapıdadır ancak Proxy genellikle sarmaladığı nesnenin yaşam süresini kendisi kontrol ederken, Decorator'da bu kontrol her zaman istemcidedir.",[87,550],{},[90,552,554],{"id":553},"proxy-tasarım-deseni-kod-örnekleri","Proxy Tasarım Deseni Kod Örnekleri",[556,557,559],"h3",{"id":558},"örnek-php-kodu","Örnek PHP Kodu",[155,561,563],{"className":157,"code":562,"language":159,"meta":160,"style":160},"\u003C?php\n\nnamespace RefactoringGuru\\Proxy\\Conceptual;\n\ninterface Subject\n{\n    public function request(): void;\n}\n\nclass RealSubject implements Subject\n{\n    public function request(): void\n    {\n        echo \"RealSubject: İstek işleniyor.\\n\";\n    }\n}\n\nclass Proxy implements Subject\n{\n    private RealSubject $realSubject;\n\n    public function __construct(RealSubject $realSubject)\n    {\n        $this->realSubject = $realSubject;\n    }\n\n    public function request(): void\n    {\n        if ($this->checkAccess()) {\n            $this->realSubject->request();\n            $this->logAccess();\n        }\n    }\n\n    private function checkAccess(): bool\n    {\n        echo \"Proxy: İstek gönderilmeden önce yetkilendirme kontrolü yapılıyor.\\n\";\n        return true;\n    }\n\n    private function logAccess(): void\n    {\n        echo \"Proxy: İstek zamanı kayıt altına alındı.\\n\";\n    }\n}\n\nfunction clientCode(Subject $subject)\n{\n    $subject->request();\n}\n\necho \"İstemci: Gerçek servis nesnesi doğrudan çağrılıyor:\\n\";\n$realSubject = new RealSubject();\nclientCode($realSubject);\n\necho \"\\n\";\n\necho \"İstemci: Araya proxy nesnesi entegre ediliyor:\\n\";\n$proxy = new Proxy($realSubject);\nclientCode($proxy);\n",[63,564,565,570,574,579,583,588,593,598,602,606,611,615,620,625,630,634,638,642,647,651,656,660,665,669,674,678,682,686,690,695,700,705,709,713,717,723,728,734,740,745,750,756,761,767,772,777,782,788,793,799,804,809,815,821,827,832,838,843,849,855],{"__ignoreMap":160},[164,566,567],{"class":166,"line":167},[164,568,569],{},"\u003C?php\n",[164,571,572],{"class":166,"line":173},[164,573,195],{"emptyLinePlaceholder":194},[164,575,576],{"class":166,"line":179},[164,577,578],{},"namespace RefactoringGuru\\Proxy\\Conceptual;\n",[164,580,581],{"class":166,"line":185},[164,582,195],{"emptyLinePlaceholder":194},[164,584,585],{"class":166,"line":191},[164,586,587],{},"interface Subject\n",[164,589,590],{"class":166,"line":198},[164,591,592],{},"{\n",[164,594,595],{"class":166,"line":204},[164,596,597],{},"    public function request(): void;\n",[164,599,600],{"class":166,"line":210},[164,601,188],{},[164,603,604],{"class":166,"line":216},[164,605,195],{"emptyLinePlaceholder":194},[164,607,608],{"class":166,"line":222},[164,609,610],{},"class RealSubject implements Subject\n",[164,612,613],{"class":166,"line":228},[164,614,592],{},[164,616,617],{"class":166,"line":234},[164,618,619],{},"    public function request(): void\n",[164,621,622],{"class":166,"line":240},[164,623,624],{},"    {\n",[164,626,627],{"class":166,"line":245},[164,628,629],{},"        echo \"RealSubject: İstek işleniyor.\\n\";\n",[164,631,632],{"class":166,"line":250},[164,633,237],{},[164,635,636],{"class":166,"line":256},[164,637,188],{},[164,639,640],{"class":166,"line":262},[164,641,195],{"emptyLinePlaceholder":194},[164,643,644],{"class":166,"line":268},[164,645,646],{},"class Proxy implements Subject\n",[164,648,649],{"class":166,"line":274},[164,650,592],{},[164,652,653],{"class":166,"line":279},[164,654,655],{},"    private RealSubject $realSubject;\n",[164,657,658],{"class":166,"line":285},[164,659,195],{"emptyLinePlaceholder":194},[164,661,662],{"class":166,"line":291},[164,663,664],{},"    public function __construct(RealSubject $realSubject)\n",[164,666,667],{"class":166,"line":296},[164,668,624],{},[164,670,671],{"class":166,"line":301},[164,672,673],{},"        $this->realSubject = $realSubject;\n",[164,675,676],{"class":166,"line":306},[164,677,237],{},[164,679,680],{"class":166,"line":312},[164,681,195],{"emptyLinePlaceholder":194},[164,683,684],{"class":166,"line":318},[164,685,619],{},[164,687,688],{"class":166,"line":324},[164,689,624],{},[164,691,692],{"class":166,"line":330},[164,693,694],{},"        if ($this->checkAccess()) {\n",[164,696,697],{"class":166,"line":336},[164,698,699],{},"            $this->realSubject->request();\n",[164,701,702],{"class":166,"line":342},[164,703,704],{},"            $this->logAccess();\n",[164,706,707],{"class":166,"line":348},[164,708,345],{},[164,710,711],{"class":166,"line":354},[164,712,237],{},[164,714,715],{"class":166,"line":359},[164,716,195],{"emptyLinePlaceholder":194},[164,718,720],{"class":166,"line":719},35,[164,721,722],{},"    private function checkAccess(): bool\n",[164,724,726],{"class":166,"line":725},36,[164,727,624],{},[164,729,731],{"class":166,"line":730},37,[164,732,733],{},"        echo \"Proxy: İstek gönderilmeden önce yetkilendirme kontrolü yapılıyor.\\n\";\n",[164,735,737],{"class":166,"line":736},38,[164,738,739],{},"        return true;\n",[164,741,743],{"class":166,"line":742},39,[164,744,237],{},[164,746,748],{"class":166,"line":747},40,[164,749,195],{"emptyLinePlaceholder":194},[164,751,753],{"class":166,"line":752},41,[164,754,755],{},"    private function logAccess(): void\n",[164,757,759],{"class":166,"line":758},42,[164,760,624],{},[164,762,764],{"class":166,"line":763},43,[164,765,766],{},"        echo \"Proxy: İstek zamanı kayıt altına alındı.\\n\";\n",[164,768,770],{"class":166,"line":769},44,[164,771,237],{},[164,773,775],{"class":166,"line":774},45,[164,776,188],{},[164,778,780],{"class":166,"line":779},46,[164,781,195],{"emptyLinePlaceholder":194},[164,783,785],{"class":166,"line":784},47,[164,786,787],{},"function clientCode(Subject $subject)\n",[164,789,791],{"class":166,"line":790},48,[164,792,592],{},[164,794,796],{"class":166,"line":795},49,[164,797,798],{},"    $subject->request();\n",[164,800,802],{"class":166,"line":801},50,[164,803,188],{},[164,805,807],{"class":166,"line":806},51,[164,808,195],{"emptyLinePlaceholder":194},[164,810,812],{"class":166,"line":811},52,[164,813,814],{},"echo \"İstemci: Gerçek servis nesnesi doğrudan çağrılıyor:\\n\";\n",[164,816,818],{"class":166,"line":817},53,[164,819,820],{},"$realSubject = new RealSubject();\n",[164,822,824],{"class":166,"line":823},54,[164,825,826],{},"clientCode($realSubject);\n",[164,828,830],{"class":166,"line":829},55,[164,831,195],{"emptyLinePlaceholder":194},[164,833,835],{"class":166,"line":834},56,[164,836,837],{},"echo \"\\n\";\n",[164,839,841],{"class":166,"line":840},57,[164,842,195],{"emptyLinePlaceholder":194},[164,844,846],{"class":166,"line":845},58,[164,847,848],{},"echo \"İstemci: Araya proxy nesnesi entegre ediliyor:\\n\";\n",[164,850,852],{"class":166,"line":851},59,[164,853,854],{},"$proxy = new Proxy($realSubject);\n",[164,856,858],{"class":166,"line":857},60,[164,859,860],{},"clientCode($proxy);\n",[556,862,864],{"id":863},"örnek-python-kodu","Örnek Python Kodu",[155,866,870],{"className":867,"code":868,"language":869,"meta":160,"style":160},"language-python shiki shiki-themes github-light github-dark","from abc import ABC, abstractmethod\n\nclass Subject(ABC):\n    @abstractmethod\n    def request(self) -> None:\n        pass\n\n\nclass RealSubject(Subject):\n    def request(self) -> None:\n        print(\"RealSubject: İstek işleniyor.\")\n\n\nclass Proxy(Subject):\n    def __init__(self, real_subject: RealSubject) -> None:\n        self._real_subject = real_subject\n\n    def request(self) -> None:\n        if self.check_access():\n            self._real_subject.request()\n            self.log_access()\n\n    def check_access(self) -> bool:\n        print(\"Proxy: İstek gönderilmeden önce yetkilendirme kontrolü yapılıyor.\")\n        return True\n\n    def log_access(self) -> None:\n        print(\"Proxy: İstek zamanı kayıt altına alındı.\")\n\n\ndef client_code(subject: Subject) -> None:\n    subject.request()\n\n\nif __name__ == \"__main__\":\n    print(\"İstemci: Gerçek nesne çağrılıyor:\")\n    real_subject = RealSubject()\n    client_code(real_subject)\n\n    print(\"\")\n\n    print(\"İstemci: Proxy nesnesi çağrılıyor:\")\n    proxy = Proxy(real_subject)\n    client_code(proxy)\n","python",[63,871,872,877,881,886,891,896,901,905,909,914,918,923,927,931,936,941,946,950,954,959,964,969,973,978,983,988,992,997,1002,1006,1010,1015,1020,1024,1028,1033,1038,1043,1048,1052,1057,1061,1066,1071],{"__ignoreMap":160},[164,873,874],{"class":166,"line":167},[164,875,876],{},"from abc import ABC, abstractmethod\n",[164,878,879],{"class":166,"line":173},[164,880,195],{"emptyLinePlaceholder":194},[164,882,883],{"class":166,"line":179},[164,884,885],{},"class Subject(ABC):\n",[164,887,888],{"class":166,"line":185},[164,889,890],{},"    @abstractmethod\n",[164,892,893],{"class":166,"line":191},[164,894,895],{},"    def request(self) -> None:\n",[164,897,898],{"class":166,"line":198},[164,899,900],{},"        pass\n",[164,902,903],{"class":166,"line":204},[164,904,195],{"emptyLinePlaceholder":194},[164,906,907],{"class":166,"line":210},[164,908,195],{"emptyLinePlaceholder":194},[164,910,911],{"class":166,"line":216},[164,912,913],{},"class RealSubject(Subject):\n",[164,915,916],{"class":166,"line":222},[164,917,895],{},[164,919,920],{"class":166,"line":228},[164,921,922],{},"        print(\"RealSubject: İstek işleniyor.\")\n",[164,924,925],{"class":166,"line":234},[164,926,195],{"emptyLinePlaceholder":194},[164,928,929],{"class":166,"line":240},[164,930,195],{"emptyLinePlaceholder":194},[164,932,933],{"class":166,"line":245},[164,934,935],{},"class Proxy(Subject):\n",[164,937,938],{"class":166,"line":250},[164,939,940],{},"    def __init__(self, real_subject: RealSubject) -> None:\n",[164,942,943],{"class":166,"line":256},[164,944,945],{},"        self._real_subject = real_subject\n",[164,947,948],{"class":166,"line":262},[164,949,195],{"emptyLinePlaceholder":194},[164,951,952],{"class":166,"line":268},[164,953,895],{},[164,955,956],{"class":166,"line":274},[164,957,958],{},"        if self.check_access():\n",[164,960,961],{"class":166,"line":279},[164,962,963],{},"            self._real_subject.request()\n",[164,965,966],{"class":166,"line":285},[164,967,968],{},"            self.log_access()\n",[164,970,971],{"class":166,"line":291},[164,972,195],{"emptyLinePlaceholder":194},[164,974,975],{"class":166,"line":296},[164,976,977],{},"    def check_access(self) -> bool:\n",[164,979,980],{"class":166,"line":301},[164,981,982],{},"        print(\"Proxy: İstek gönderilmeden önce yetkilendirme kontrolü yapılıyor.\")\n",[164,984,985],{"class":166,"line":306},[164,986,987],{},"        return True\n",[164,989,990],{"class":166,"line":312},[164,991,195],{"emptyLinePlaceholder":194},[164,993,994],{"class":166,"line":318},[164,995,996],{},"    def log_access(self) -> None:\n",[164,998,999],{"class":166,"line":324},[164,1000,1001],{},"        print(\"Proxy: İstek zamanı kayıt altına alındı.\")\n",[164,1003,1004],{"class":166,"line":330},[164,1005,195],{"emptyLinePlaceholder":194},[164,1007,1008],{"class":166,"line":336},[164,1009,195],{"emptyLinePlaceholder":194},[164,1011,1012],{"class":166,"line":342},[164,1013,1014],{},"def client_code(subject: Subject) -> None:\n",[164,1016,1017],{"class":166,"line":348},[164,1018,1019],{},"    subject.request()\n",[164,1021,1022],{"class":166,"line":354},[164,1023,195],{"emptyLinePlaceholder":194},[164,1025,1026],{"class":166,"line":359},[164,1027,195],{"emptyLinePlaceholder":194},[164,1029,1030],{"class":166,"line":719},[164,1031,1032],{},"if __name__ == \"__main__\":\n",[164,1034,1035],{"class":166,"line":725},[164,1036,1037],{},"    print(\"İstemci: Gerçek nesne çağrılıyor:\")\n",[164,1039,1040],{"class":166,"line":730},[164,1041,1042],{},"    real_subject = RealSubject()\n",[164,1044,1045],{"class":166,"line":736},[164,1046,1047],{},"    client_code(real_subject)\n",[164,1049,1050],{"class":166,"line":742},[164,1051,195],{"emptyLinePlaceholder":194},[164,1053,1054],{"class":166,"line":747},[164,1055,1056],{},"    print(\"\")\n",[164,1058,1059],{"class":166,"line":752},[164,1060,195],{"emptyLinePlaceholder":194},[164,1062,1063],{"class":166,"line":758},[164,1064,1065],{},"    print(\"İstemci: Proxy nesnesi çağrılıyor:\")\n",[164,1067,1068],{"class":166,"line":763},[164,1069,1070],{},"    proxy = Proxy(real_subject)\n",[164,1072,1073],{"class":166,"line":769},[164,1074,1075],{},"    client_code(proxy)\n",[87,1077],{},[90,1079,1081],{"id":1080},"sıkça-sorulan-sorular-faq","Sıkça Sorulan Sorular (FAQ)",[556,1083,1085],{"id":1084},"proxy-deseni-ile-decorator-deseni-arasındaki-en-temel-fark-nedir","Proxy deseni ile Decorator deseni arasındaki en temel fark nedir?",[47,1087,1088,1098],{},[50,1089,1090,1093,1094,1097],{},[43,1091,1092],{},"Proxy:"," Bir nesneye erişimi denetler veya sınırlandırır. Sarmaladığı nesnenin yaşam döngüsünü kendisi kontrol edebilir (örneğin nesneyi kendi içinde ",[63,1095,1096],{},"new"," ile yaratabilir veya silebilir).",[50,1099,1100,1103],{},[43,1101,1102],{},"Decorator:"," Bir nesneye dinamik olarak yeni davranışlar ekler. Sarmalayacağı nesneyi dışarıdan (istemciden) hazır olarak alır; nesne yaratma sorumluluğu yoktur.",[556,1105,1107],{"id":1106},"proxy-deseni-performansa-ek-bir-yük-overhead-getirir-mi","Proxy deseni performansa ek bir yük (overhead) getirir mi?",[11,1109,1110,1111,545,1114,1117],{},"Araya ek bir nesne ve metot çağrısı girdiği için teorik olarak mikro düzeyde bir gecikme ekler. Ancak gerçek hayatta, özellikle ",[43,1112,1113],{},"Caching Proxy",[43,1115,1116],{},"Virtual Proxy"," kullanıldığında, gereksiz API\u002Fveritabanı sorgularını ve yoğun kaynak harcayan işlemleri engellediği için sistemin genel performansını kat kat artırır.",[556,1119,1121],{"id":1120},"protection-proxy-koruma-proxysi-güvenliği-tek-başına-sağlamak-için-yeterli-midir","Protection Proxy (Koruma Proxy'si) güvenliği tek başına sağlamak için yeterli midir?",[11,1123,1124],{},"Protection Proxy, uygulama kodu seviyesinde yetkilendirme (authorization) yapmak için mükemmel bir desendir. Ancak ağ güvenliği veya veritabanı erişim güvenliği gibi altyapısal güvenlik katmanlarının yerini tek başına alamaz. Uygulama seviyesinde rolleri (örneğin Admin\u002FUser ayrımı) kontrol etmek için kullanılır.",[87,1126],{},[90,1128,1130],{"id":1129},"diğer-tasarım-kalıplarıdesign-patterns","Diğer Tasarım Kalıpları\u002FDesign Patterns",[11,1132,1133],{},[43,1134,1135],{},"Oluşumsal Kalıplar (Creational Patterns)",[11,1137,1138,1142,1143,1142,1147,1142,1151,1142,1155],{},[15,1139,1141],{"href":1140},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-factory-method-nedir","Factory Method",",\n",[15,1144,1146],{"href":1145},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-abstract-factory-nedir","Abstract Factory",[15,1148,1150],{"href":1149},"\u002Ftr\u002Fbuilder-tasarim-deseni-nedir","Builder",[15,1152,1154],{"href":1153},"\u002Ftr\u002Fprototype-tasarim-deseni-nedir","Prototype",[15,1156,1158],{"href":1157},"\u002Ftr\u002Fsingleton-tasarim-deseni-nedir","Singleton",[11,1160,1161],{},[43,1162,1163],{},"Yapısal Kalıplar (Structural Patterns)",[11,1165,1166,1142,1169,1142,1173,1142,1177,1142,1180,1142,1183,1142,1187],{},[15,1167,445],{"href":1168},"\u002Ftr\u002Fadapter-tasarim-deseni-nedir",[15,1170,1172],{"href":1171},"\u002Ftr\u002Fbridge-tasarim-deseni-nedir","Bridge",[15,1174,1176],{"href":1175},"\u002Ftr\u002Fcomposite-tasarim-deseni-nedir","Composite",[15,1178,423],{"href":1179},"\u002Ftr\u002Fdecorator-tasarim-deseni-nedir",[15,1181,463],{"href":1182},"\u002Ftr\u002Ffacade-tasarim-deseni-nedir",[15,1184,1186],{"href":1185},"\u002Ftr\u002Fflyweight-tasarim-deseni-nedir","Flyweight",[15,1188,73],{"href":1189},"\u002Ftr\u002Fproxy-tasarim-deseni-nedir",[11,1191,1192],{},[43,1193,1194],{},"Davranışsal Kalıplar (Behavioral Patterns)",[11,1196,1197,1142,1201,1142,1205,1142,1209,1142,1213,1142,1217,1142,1221,1142,1225,1142,1229,1142,1233],{},[15,1198,1200],{"href":1199},"\u002Ftr\u002Fchain-of-responsibility-deseni-nedir","Chain of Responsibility",[15,1202,1204],{"href":1203},"\u002Ftr\u002Fcommand-tasarim-deseni-nedir","Command",[15,1206,1208],{"href":1207},"\u002Ftr\u002Fiterator-tasarim-deseni-nedir","Iterator",[15,1210,1212],{"href":1211},"\u002Ftr\u002Fmediator-tasarim-deseni-nedir","Mediator",[15,1214,1216],{"href":1215},"\u002Ftr\u002Fmemento-tasarim-deseni-nedir","Memento",[15,1218,1220],{"href":1219},"\u002Ftr\u002Fobserver-tasarim-deseni-nedir","Observer",[15,1222,1224],{"href":1223},"\u002Ftr\u002Fstate-tasarim-deseni-nedir","State",[15,1226,1228],{"href":1227},"\u002Ftr\u002Fstrategy-tasarim-deseni-nedir","Strategy",[15,1230,1232],{"href":1231},"\u002Ftr\u002Ftemplate-method-tasarim-deseni-nedir","Template Method",[15,1234,1236],{"href":1235},"\u002Ftr\u002Fvisitor-tasarim-deseni-nedir","Visitor",[1238,1239,1240],"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":160,"searchDepth":173,"depth":173,"links":1242},[1243,1244,1245,1246,1247,1248,1249,1250,1254,1259],{"id":92,"depth":173,"text":93},{"id":103,"depth":173,"text":104},{"id":125,"depth":173,"text":126},{"id":149,"depth":173,"text":150},{"id":366,"depth":173,"text":367},{"id":480,"depth":173,"text":481},{"id":521,"depth":173,"text":522},{"id":553,"depth":173,"text":554,"children":1251},[1252,1253],{"id":558,"depth":179,"text":559},{"id":863,"depth":179,"text":864},{"id":1080,"depth":173,"text":1081,"children":1255},[1256,1257,1258],{"id":1084,"depth":179,"text":1085},{"id":1106,"depth":179,"text":1107},{"id":1120,"depth":179,"text":1121},{"id":1129,"depth":173,"text":1130},[1261],"technical",null,"2021-09-15","Proxy (Vekil) tasarım kalıbını, erişim kontrolünü, gecikmeli yüklemeyi (lazy loading), caching senaryolarını ve PHP\u002FPython örneklerini öğrenin.",false,"md","\u002Fimages\u002Fposts\u002F2021\u002F09\u002Fproxy-tasarim-deseni.avif",{},{"title":6,"description":1264},"proxy-tasarim-deseni-nedir","tr\u002Fproxy-tasarim-deseni-nedir",[1273,1274],"design-pattern","ipucu","MUyYbGc9qNj-oPfsTJfUYJTFW7yJAES44n8cNLJreTQ",{"prev":1277,"next":1280,"others":1282,"lucky":1394,"readingTime":198},{"path":1278,"title":1279},"\u002Ftr\u002Fwsl-2-kurulumu-6-kolay-adim","WSL 2 Kurulumu - 6 kolay adım",{"path":1185,"title":1281},"Flyweight Tasarım Deseni Nedir?",[1283,1286,1288,1290,1293,1296,1298,1301,1304,1307,1310,1312,1314,1317,1319,1322,1325,1328,1331,1334,1337,1339,1341,1344,1347,1350,1353,1356,1359,1362,1365,1368,1371,1373,1376,1379,1382,1385,1388,1391],{"path":1284,"title":1285},"\u002Ftr\u002Fphp-ve-makine-ogrenimi-php-ml-kutuphanesi","PHP ve Makine Öğrenimi: PHP-ML Kütüphanesi ile Pratik Çözümler",{"path":1223,"title":1287},"State Tasarım Deseni Nedir?",{"path":1149,"title":1289},"Builder Tasarım Deseni Nedir?",{"path":1291,"title":1292},"\u002Ftr\u002Fearly-return-erken-donus-nedir","Early Return \u002F Erken Dönüş nedir?",{"path":1294,"title":1295},"\u002Ftr\u002Fself-hosted-api-gateway-nasil-kurulur-kapsamli-rehber","Self-Hosted API Gateway Nasıl Kurulur? Kapsamlı Rehber",{"path":1215,"title":1297},"Memento Tasarım Deseni Nedir?",{"path":1299,"title":1300},"\u002Ftr\u002Fes6-nedir-ecmascript-2015-nedir","ES6 Nedir? ECMAScript 2015 Nedir?",{"path":1302,"title":1303},"\u002Ftr\u002Fgo-programlama-dilinin-ozellikleri","Go Programlama Dilinin Özellikleri",{"path":1305,"title":1306},"\u002Ftr\u002Ftemiz-moduler-ve-yeniden-kullanilabilir-php-kodu-yazma-rehberi","PHP'de Temiz, Modüler ve Yeniden Kullanılabilir Kod Yazma Rehberi",{"path":1308,"title":1309},"\u002Ftr\u002Fwordpress-yonetici-sifresini-wp-cli-kullanarak-sifirlama","WordPress Yönetici Şifresini WP-CLI Kullanarak Sıfırlama",{"path":1179,"title":1311},"Decorator Tasarım Deseni Nedir?",{"path":1182,"title":1313},"Facade Tasarım Deseni Nedir?",{"path":1315,"title":1316},"\u002Ftr\u002Fes12-nedir-ecmascript-2021-nedir","ES12 Nedir? ECMAScript 2021 Nedir?",{"path":1207,"title":1318},"Iterator Tasarım Deseni Nedir?",{"path":1320,"title":1321},"\u002Ftr\u002Fgo-slice-veri-tipi","Go Veri Tipleri: Slice",{"path":1323,"title":1324},"\u002Ftr\u002Fphp-generator-ve-iterator-farki","PHP'de Generator ve Iterator Arasındaki Temel Farklar",{"path":1326,"title":1327},"\u002Ftr\u002Fubuntu-24-04-uzerinde-cyberpanel-kurulumu","Ubuntu 24.04 LTS ve 22.04 LTS Üzerinde CyberPanel Kurulumu",{"path":1329,"title":1330},"\u002Ftr\u002Fes14-nedir-ecmascript-2023-nedir","ES14 nedir? ECMAScript 2023 nedir?",{"path":1332,"title":1333},"\u002Ftr\u002Fgo-veri-tipleri-string-integer-float-complex-boolean-ve-array","Go Veri Tipleri - String, Integer, Float, Complex, Boolean ve Array",{"path":1335,"title":1336},"\u002Ftr\u002Fgoda-iota-nedir-iota-ne-zaman-ve-nerede-kullanilir","Go'da iota Nedir? iota Ne Zaman ve Nerede Kullanılır?",{"path":1171,"title":1338},"Bridge Tasarım Deseni Nedir?",{"path":1231,"title":1340},"Template Method Tasarım Deseni Nedir?",{"path":1342,"title":1343},"\u002Ftr\u002Fgo-veri-tipleri-map","Go Veri Tipleri - Map",{"path":1345,"title":1346},"\u002Ftr\u002Fes5-nedir","ES5 Nedir? JavaScript Geliştiricileri İçin Kılavuz",{"path":1348,"title":1349},"\u002Ftr\u002Fjwt-guvenli-mi-guvenlik-acigi-olusturmayin","JWT Güvenli Derken Güvenlik Açığı Oluşturmayın",{"path":1351,"title":1352},"\u002Ftr\u002Fdocker-ile-mongodb-kurulumu","Docker ile MongoDB Kurulumu",{"path":1354,"title":1355},"\u002Ftr\u002Fes7-nedir-ecmascript-2016-nedir","ES7 Nedir? ECMAScript 2016 Nedir?",{"path":1357,"title":1358},"\u002Ftr\u002Fnostalji-ibibik-online","Nostalji: İbibik Online (1998'den Bir Web Macerası)",{"path":1360,"title":1361},"\u002Ftr\u002Flinuxda-golang-kurulumu","Linux'ta Golang Kurulumu",{"path":1363,"title":1364},"\u002Ftr\u002Fwindows-10-golang-kurulumu","Windows 10 ve 11'de Golang Kurulumu ve GOPATH Yapılandırması",{"path":1366,"title":1367},"\u002Ftr\u002Fdocker-swarm-nedir","Docker Swarm Nedir?",{"path":1369,"title":1370},"\u002Ftr\u002Frestapi-ve-hateoas-kavrami","RestApi ve HATEOAS Kavramı",{"path":1235,"title":1372},"Visitor Tasarım Deseni Nedir?",{"path":1374,"title":1375},"\u002Ftr\u002Fes8-nedir-ecmascript-2017-nedir","ES8 Nedir? ECMAScript 2017 Nedir?",{"path":1377,"title":1378},"\u002Ftr\u002Fgo-veri-tipleri-struct","Go Veri Tipleri: Struct",{"path":1380,"title":1381},"\u002Ftr\u002Frest-api-kimlik-dogrulama-nasil-yapilir","REST API Kimlik Doğrulama Nasıl Yapılır?",{"path":1383,"title":1384},"\u002Ftr\u002Fes13-nedir-ecmascript-2022-nedir","ES13 nedir? ECMAScript 2022 nedir?",{"path":1386,"title":1387},"\u002Ftr\u002Fmutable-ve-immutable-kavrami","Mutable ve Immutable Kavramları Nedir?",{"path":1389,"title":1390},"\u002Ftr\u002Fdocker-ile-mariadb-kurulumu","Docker ile MariaDB Kurulumu",{"path":1392,"title":1393},"\u002Ftr\u002Fvite-nedir","Vite Nedir? Modern Web Geliştirme ve Paketleme Aracı",{"path":1395,"title":1396},"\u002Ftr\u002Ffull-stack-proje-agaci","Full-Stack Proje Yol Haritası ve İçindekiler",[1398,1400,1402,1405],{"path":1235,"title":1372,"date":1399},"2021-10-09",{"path":1231,"title":1340,"date":1401},"2021-10-08",{"path":1227,"title":1403,"date":1404},"Strategy Tasarım Deseni Nedir?","2021-10-07",{"path":1223,"title":1287,"date":1406},"2021-10-06",[1408,1412,1415],{"path":1409,"title":1410,"date":1411},"\u002Ftr\u002Ftailwind-css-nerede-kullanilir-tailwind-css-nerede-kullanilmaz","Tailwind CSS Nerede Kullanılır? Tailwind CSS Nerede Kullanılmaz?","2021-09-25",{"path":1168,"title":1413,"date":1414},"Adapter Tasarım Deseni Nedir?","2021-08-21",{"path":1416,"title":1417,"date":1418},"\u002Ftr\u002Fgo-ile-websockets-websocket-upgrader-nedir","Go ile WebSockets: Upgrader Nedir?","2021-08-02",1782142007838]