﻿
{"id":4332,"date":"2016-05-10T15:55:27","date_gmt":"2016-05-10T15:55:27","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=4332"},"modified":"2016-05-10T15:55:27","modified_gmt":"2016-05-10T15:55:27","slug":"c-proxy-design-patternproxy-tasarim-deseni","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-proxy-design-patternproxy-tasarim-deseni\/","title":{"rendered":"C# Proxy Design Pattern(Proxy Tasar\u0131m Deseni)"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu makalemizde Structural Patterns(Yap\u0131sal Desenler) kategorisine giren Proxy Design Pattern hakk\u0131nda teferruatl\u0131 bir i\u00e7erik olu\u015fturaca\u011f\u0131z.<\/p>\n<p>Olu\u015fturdu\u011fumuz tasar\u0131mda baz\u0131 s\u0131n\u0131flar\u0131n, nesnelerin yahut i\u015fleyi\u015flerin sorumluluk ve s\u00fcre\u00e7teki i\u015flevsel hallerini bir ba\u015fka nesne \u00fczerinde kontrol edebilir ve sorumlulu\u011fu bu nesneye y\u00fckleyebiliriz. Daha net bir ifadeyle, nesnelerin s\u00fcre\u00e7teki vekaletini ba\u015fka bir s\u0131n\u0131fa devredebiliriz. \u0130\u015fte bu yaz\u0131m\u0131zda da bu bahsetti\u011fim algoritman\u0131n deseninden yani Proxy Design Pattern&#8217;den bahsediyor olaca\u011f\u0131z.<\/p>\n<p>Bu tarz bir uygulamay\u0131 tasar\u0131m desenini bilmeden de hemen hemen \u00e7o\u011fumuzun ger\u00e7ekle\u015ftirmi\u015f olmas\u0131 muhtemeldir. Eee, hepimiz bir \u00e7ok Design Pattern&#8217;i fark\u0131nda olmaks\u0131z\u0131n \u00f6nceden kulland\u0131\u011f\u0131m\u0131z\u0131 sonradan desenleri \u00f6\u011frenirken g\u00f6rm\u00fc\u015f\u00fczd\u00fcr. D.P. yap\u0131lar\u0131, belirli durumlarda tekrarlanan ve kal\u0131p olarak ihtiya\u00e7 duyulan noktada uygulanabilen manevralardan ibarettir ve tek bir dile ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 yoktur. Ondand\u0131r ki tasar\u0131m deseni dedi\u011fimiz olgu, &#8220;Akl\u0131n yolu birdir&#8221; s\u00f6z\u00fcn\u00fc olduk\u00e7a do\u011frulamaktad\u0131r.<\/p>\n<p>\u015eimdi Proxy tasar\u0131m\u0131n\u0131 incelemeye ba\u015flayal\u0131m.<\/p>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/c-proxy-design-patternproxy-tasarim-deseni\/c-proxy-design-patternproxy-tasarim-deseni\/\" rel=\"attachment wp-att-4341\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/05\/C-Proxy-Design-PatternProxy-Tasar\u0131m-Deseni.jpg\" alt=\"C# Proxy Design Pattern(Proxy Tasar\u0131m Deseni)\" width=\"545\" height=\"284\" class=\"aligncenter size-full wp-image-4341\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/05\/C-Proxy-Design-PatternProxy-Tasar\u0131m-Deseni.jpg 545w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/05\/C-Proxy-Design-PatternProxy-Tasar\u0131m-Deseni-300x156.jpg 300w\" sizes=\"auto, (max-width: 545px) 100vw, 545px\" \/><\/a><\/p>\n<p>Proxy D.P. Client taraf\u0131ndan eri\u015filecek nesneye vekalet eden bir tasar\u0131m desenidir. Burada vekaletten kas\u0131t ilgili nesneyi kontrol edecek bir Proxy nesnesinin kullan\u0131lmas\u0131d\u0131r.<\/p>\n<p>\u00dc\u00e7 farkl\u0131 durumda Proxy D.P. kullan\u0131l\u0131r.<\/p>\n<ol>\n<li><em><strong>Remote(Uzak) Proxy<\/strong><\/em><br \/>\nRemote(uzak) bir nesne kullan\u0131laca\u011f\u0131 durumlarda kullan\u0131labilir. Uzaktaki nesneye local bir temsilci sa\u011flar ve gerekli kontrolleri yapmam\u0131za olanak tan\u0131r.<\/li>\n<li><em><strong>Virtual Proxy<\/strong><\/em><br \/>\n\u00dcretimi yahut kullan\u0131m\u0131 maliyetli nesnelerin olu\u015fturulmas\u0131 veya kullan\u0131lmas\u0131 i\u00e7in tercih edilir. Buna \u00f6rnek olarak genelde herkesin dillendirdi\u011fi\u00a0resim y\u00fckleme i\u015flevini verebiliriz. Y\u00fcksek boyutlu bir resmin boyutundan dolay\u0131 ge\u00e7 y\u00fcklenmesi durumunda verilen -y\u00fckleniyor- mesaj\u0131 ve ard\u0131ndan y\u00fckleme i\u015flemi bitti\u011fi anda resmin g\u00f6sterilmesinde kullan\u0131labilir.<\/li>\n<li><em><strong>Protection Proxy<\/strong><\/em><br \/>\nYetkilendirme yahut login durumlar\u0131nda kullan\u0131labilir.<\/li>\n<\/ol>\n<p>Proxy desenini uygularken bu \u00fc\u00e7 duruma genel olarak a\u015fa\u011f\u0131daki terminolojiyle hareket edilecektir.<\/p>\n<ul>\n<li><em><strong>Client<\/strong><\/em><br \/>\n\u0130stemcidir.<\/li>\n<li><em><strong>Subject<\/strong><\/em><br \/>\n\u0130stemcinin tek bir tip ile \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayacak olan Interface yahut abstract class&#8217;\u0131m\u0131zd\u0131r. Real Subject ve Proxy nesnelerimizin t\u00fcredi\u011fi yap\u0131d\u0131r.<\/li>\n<li><em><strong>Real Subject<\/strong><\/em><br \/>\nO anki i\u015fin as\u0131l \u00e7al\u0131\u015fmas\u0131n\u0131 ger\u00e7ekle\u015ftirecek olan ger\u00e7ek nesnemizdir.<\/li>\n<li><em><strong>Proxy<\/strong><\/em><br \/>\nVekil s\u0131n\u0131f\u0131m\u0131zd\u0131r. \u0130\u00e7erisinde Real Subject referans\u0131n\u0131 ta\u015f\u0131yarak istemcinin isteklerine cevap verecektir. Do\u011fal olarak istemci ger\u00e7ek nesneye dolayl\u0131 yoldan Proxy \u00fczerinden eri\u015febilecektir.<\/li>\n<\/ul>\n<p>\u015eimdi Proxy D.P&#8217;i \u00f6rneklendirelim.<\/p>\n<p>\u00d6ncelikle\u00a0<em><strong>Protection Proxy<\/strong><\/em>&#8216;ye \u00f6zel \u00f6rneklendirme yapal\u0131m. \u00d6rne\u011fimizde gerekli hesap giri\u015fi yap\u0131ld\u0131\u011f\u0131 taktirde\u00a0bir banka \u00fczerinden para g\u00f6nderme i\u015flemini ger\u00e7ekle\u015ftirelim.<\/p>\n<p>A\u015fa\u011f\u0131daki kodlar\u0131 inceleyiniz.<\/p>\n<p>\u00d6ncelikle Subject Class&#8217;\u0131m\u0131z\u0131 olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Subject Class\r\n    interface IBanka\r\n    {\r\n        bool OdemeYap(double Tutar);\r\n    }\r\n<\/pre>\n<p>Ard\u0131ndan ger\u00e7ek nesnemiz olan Real Subject&#8217;i olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Real Subject Class\r\n    class Banka : IBanka\r\n    {\r\n        public bool OdemeYap(double Tutar)\r\n        {\r\n            if (Tutar &lt; 100)\r\n                Console.WriteLine($&quot;\u00d6deyece\u011finiz tutar 100 TL'den az olamaz. Fark -&gt; { 100 - Tutar }&quot;);\r\n            else if (Tutar &gt; 100)\r\n                Console.WriteLine($&quot;\u00d6deyece\u011finiz tutar 100 TL'den fazla olamaz. Fark -&gt; { Tutar - 100 }&quot;);\r\n            else\r\n            {\r\n                Console.WriteLine($&quot;\u00d6deme ba\u015far\u0131yla ger\u00e7ekle\u015ftirildi. -&gt; { Tutar }&quot;);\r\n                return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n    }\r\n<\/pre>\n<p>Dikkat ederseniz Real Subject, Subject&#8217;ten t\u00fcremekte ve art\u0131k hangi i\u015flemi yapacaksan\u0131z o i\u015flemi yapacak nesnenin ta kendisi olmas\u0131 gerekmektedir.<\/p>\n<p>\u015eimdi Proxy&#8217;i in\u015fa ederek, Client taraf\u0131ndan eri\u015fim sa\u011flanacak vekil s\u0131n\u0131f\u0131m\u0131z\u0131 olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Proxy Class\r\n    class ProxyBanka : IBanka\r\n    {\r\n        Banka banka;\r\n        bool Login;\r\n        string KullaniciAdi, Sifre;\r\n        public ProxyBanka(string KullaniciAdi, string Sifre)\r\n        {\r\n            this.KullaniciAdi = KullaniciAdi;\r\n            this.Sifre = Sifre;\r\n        }\r\n\r\n        bool GirisYap()\r\n        {\r\n            if (KullaniciAdi.Equals(&quot;gncy&quot;) &amp;&amp; Sifre.Equals(&quot;1234&quot;))\r\n            {\r\n                banka = new Banka();\r\n                Login = true;\r\n                Console.WriteLine(&quot;Hesaba giri\u015f yap\u0131ld\u0131.&quot;);\r\n                return true;\r\n            }\r\n            else\r\n                Console.WriteLine(&quot;L\u00fctfen kullan\u0131c\u0131 ad\u0131 ve \u015fifreinizi do\u011fru girdi\u011finize emin olunuz.&quot;);\r\n\r\n            Login = false;\r\n            return false;\r\n        }\r\n\r\n        public bool OdemeYap(double Tutar)\r\n        {\r\n            GirisYap();\r\n\r\n            if (!Login)\r\n            {\r\n                Console.WriteLine(&quot;Hesaba giri\u015f yap\u0131lmad\u0131\u011f\u0131ndan dolay\u0131 \u00f6deme alam\u0131yoruz.&quot;);\r\n                return false;\r\n            }\r\n\r\n            banka.OdemeYap(Tutar);\r\n            return true;\r\n        }\r\n    }\r\n<\/pre>\n<p>Burada dikkat etmeniz gereken husus, <em><strong>Protection Proxy<\/strong><\/em>&#8216;e \u00f6zel \u00f6rneklendirme yapt\u0131\u011f\u0131m\u0131z i\u00e7in yap\u0131lacak yetkilendirme i\u015flemine uygun bir algoritma ger\u00e7ekle\u015ftirdik.<\/p>\n<p>Bu tasar\u0131y\u0131 Client taraf\u0131nda a\u015fa\u011f\u0131daki gibi kullanabilmekteyiz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Client\r\n    class Program\r\n    {\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            string KullaniciAdi = &quot;&quot;, Sifre = &quot;&quot;;\r\n            double Tutar = 0;\r\n            while (true)\r\n            {\r\n                Console.WriteLine(&quot;L\u00fctfen kullan\u0131c\u0131 ad\u0131n\u0131z\u0131 giriniz.&quot;);\r\n                KullaniciAdi = Console.ReadLine();\r\n\r\n                Console.WriteLine(&quot;L\u00fctfen \u015fifrenizi giriniz.&quot;);\r\n                Sifre = Console.ReadLine();\r\n\r\n                Console.WriteLine(&quot;L\u00fctfen \u00f6denecek miktar\u0131 giriniz.&quot;);\r\n                Tutar = Convert.ToInt32(Console.ReadLine());\r\n\r\n                IBanka banka = new ProxyBanka(KullaniciAdi, Sifre);\r\n                banka.OdemeYap(Tutar);\r\n\r\n                Console.WriteLine(&quot;************&quot;);\r\n            }\r\n        }\r\n    }\r\n<\/pre>\n<p>\u00d6rneklendirmemizde yapm\u0131\u015f oldu\u011fum Proxy D.P.&#8217;in Client kodlar\u0131n\u0131 biraz sadelikten uzak tuttu\u011fumu kabul ediyorum. Sonsuz d\u00f6ng\u00fc i\u00e7erisinde bir kullan\u0131m yapmam\u0131n sebebi a\u015fa\u011f\u0131daki videoda oldu\u011fu gibi daha net bir test s\u00fcreci ge\u00e7irmemizi sa\u011flamas\u0131ndan kaynaklanmaktad\u0131r.<\/p>\n<p><iframe loading=\"lazy\" width=\"400\" height=\"225\" src=\"https:\/\/www.youtube-nocookie.com\/embed\/L5lR-ijSIQY\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n<p>\u015eimdide <em><strong>Virtual Proxy<\/strong><\/em>&#8216;e \u00f6zel bir \u00f6rneklendirme yaparak konumuzu tamamlayal\u0131m. Virtual Proxy&#8217;ye \u00f6zel senaryomuz ise yukar\u0131da vermi\u015f oldu\u011fumuz resim \u00f6rne\u011fi olacakt\u0131r.<\/p>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/c-proxy-design-patternproxy-tasarim-deseni\/c-proxy-design-patternproxy-tasarim-deseni-2\/\" rel=\"attachment wp-att-4342\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/05\/C-Proxy-Design-PatternProxy-Tasar\u0131m-Deseni-1.jpg\" alt=\"C# Proxy Design Pattern(Proxy Tasar\u0131m Deseni)\" width=\"742\" height=\"383\" class=\"aligncenter size-full wp-image-4342\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/05\/C-Proxy-Design-PatternProxy-Tasar\u0131m-Deseni-1.jpg 742w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/05\/C-Proxy-Design-PatternProxy-Tasar\u0131m-Deseni-1-300x155.jpg 300w\" sizes=\"auto, (max-width: 742px) 100vw, 742px\" \/><\/a><\/p>\n<p>\u00d6rne\u011fimizde kullanaca\u011f\u0131m\u0131z formun tasar\u0131m\u0131 yukar\u0131daki gibi olacakt\u0131r. \u00c7al\u0131\u015fmam\u0131z\u0131n t\u00fcm yap\u0131lar\u0131n\u0131 a\u015fa\u011f\u0131da ele alal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Subject Class\r\n    interface IResim\r\n    {\r\n        void Goster(PictureBox pb, string Dizin);\r\n    }\r\n\r\n    \/\/Real Subject Class\r\n    class Resim : IResim\r\n    {\r\n        public void Goster(PictureBox pb, string Dizin)\r\n        {\r\n            pb.ImageLocation = Dizin;\r\n        }\r\n    }\r\n\r\n    \/\/Proxy Class\r\n    class ProxyResim : IResim\r\n    {\r\n        Resim resim;\r\n        bool ResimYuklendi;\r\n        PictureBox pb;\r\n        string Dizin;\r\n        void ResimYukle(object o)\r\n        {\r\n            resim = new Resim();\r\n            resim.Goster(pb, Dizin);\r\n            ResimYuklendi = true;\r\n        }\r\n        public void Goster(PictureBox pb, string Dizin)\r\n        {\r\n            this.pb = pb;\r\n            this.Dizin = Dizin;\r\n\r\n            if (resim == null)\r\n            {\r\n                new System.Threading.Timer(new TimerCallback(ResimYukle), this, 2000, 0);\r\n            }\r\n\r\n            if (!ResimYuklendi)\r\n            {\r\n                pb.ImageLocation = &quot;D:\\\\Yukleniyor.gif&quot;;\r\n            }\r\n        }\r\n    }\r\n<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi ProxyResim s\u0131n\u0131f\u0131ndaki Goster metodunda Real Subject referans\u0131 null ise bir Thread ba\u015flatt\u0131k ve ResimYukle metodunu 2 saniyelik bir farkla tetiklettik. Bu s\u0131rada Thread tetiklenene kadar 2 saniye i\u00e7erisinde alt sat\u0131rlar\u0131 gelip gerekli if &#8211; else kontrol\u00fc sayesinde -y\u00fckleniyor- mesaj\u0131n\u0131 verecek resmi PictureBox nesnesinde g\u00f6sterdik. ResimYukle metodu tetiklendi\u011finde ilgili referansa nesne ba\u011flayarak referans \u00fczerinden Goster metodunu tetikleyecektir ve as\u0131l resmimiz ilgili nesnede g\u00f6sterilecektir.<\/p>\n<p><iframe loading=\"lazy\" width=\"400\" height=\"225\" src=\"https:\/\/www.youtube-nocookie.com\/embed\/3U_mKCNZ7E8\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n<p>San\u0131r\u0131m Proxy Tasar\u0131m Kal\u0131b\u0131n\u0131da detayl\u0131ca irdelimi\u015f olduk. Bol bol faydalanman\u0131z\u0131 dilerim&#8230;<\/p>\n<p>Okudu\u011funuz i\u00e7in te\u015fekk\u00fcr ederim.<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar dilerim&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bu makalemizde Structural Patterns(Yap\u0131sal Desenler) kategorisine giren Proxy Design Pattern hakk\u0131nda teferruatl\u0131 bir i\u00e7erik olu\u015fturaca\u011f\u0131z. Olu\u015fturdu\u011fumuz tasar\u0131mda baz\u0131 s\u0131n\u0131flar\u0131n, nesnelerin yahut i\u015fleyi\u015flerin sorumluluk ve s\u00fcre\u00e7teki i\u015flevsel hallerini bir ba\u015fka nesne \u00fczerinde kontrol edebilir&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":4341,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[153],"tags":[295,1203,1196,1194,1195,1204,1200,1198,1110,1065,1201,1199,1197,1202,1111],"class_list":["post-4332","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-design-pattern","tag-client","tag-protection-proxy","tag-proxy","tag-proxy-design-pattern","tag-proxy-tasarim-deseni","tag-real-subject","tag-remote","tag-remote-proxy","tag-structural-patterns","tag-subject","tag-uzak","tag-uzak-proxy","tag-vekil","tag-virtual-proxy","tag-yapisal-desenler"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4332","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=4332"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4332\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/4341"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=4332"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=4332"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=4332"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}