﻿
{"id":4521,"date":"2016-07-01T02:22:25","date_gmt":"2016-07-01T02:22:25","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=4521"},"modified":"2016-07-01T02:33:17","modified_gmt":"2016-07-01T02:33:17","slug":"c-template-method-design-patterntemplate-method-tasarim-deseni","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-template-method-design-patterntemplate-method-tasarim-deseni\/","title":{"rendered":"C# Template Method Design Pattern(Template Method Tasar\u0131m Deseni)"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Behavioral Patterns(Davran\u0131\u015fsal Kal\u0131plar) kategorisinde bulunan Template Method Design Pattern \u00fczerine i\u00e7erik olu\u015fturaca\u011f\u0131z.<\/p>\n<p>Template, kelime manas\u0131ndan da anla\u015f\u0131laca\u011f\u0131 \u00fczere \u015fablon demektir. Haliyle yapt\u0131\u011f\u0131m\u0131z faaliyetin in\u015fas\u0131nda belirli \u015fablonsal algorimalar \u00fczerinde \u00e7al\u0131\u015fma ger\u00e7ekle\u015ftirecek ve bu algoritmada de\u011fi\u015fkenlik g\u00f6steren noktalarda Template Method Design Pattern&#8217;i devreye sokaca\u011f\u0131z.<\/p>\n<p>D\u00fc\u015f\u00fcn\u00fcn ki, belirli yap\u0131lar i\u00e7in benzer algoritmalar kullanacaks\u0131n\u0131z. Ve bu algoritmalarda de\u011fi\u015fkenlik genele de\u011fil, \u00f6zele g\u00f6re kendini g\u00f6sterecektir. Yani demem o ki, yap\u0131lacak i\u015flemlerin algoritmalar\u0131 <strong><em>x<\/em><\/strong>, <strong><em>y<\/em><\/strong> ve <strong><em>z<\/em><\/strong> olsun ve bu algoritmalar\u0131n i\u00e7erik yap\u0131s\u0131 s\u0131ras\u0131yla <strong><em>(3, 5, 7)<\/em><\/strong>, <strong><em>(3, 2, 7)<\/em><\/strong> ve <strong><em>(3, 9, 7)<\/em><\/strong> olsunlar. Dikkat ederseniz e\u011fer, algoritmalarda 1. hane &#8220;3&#8221; ve 3. hane &#8220;7&#8221; hep ayn\u0131 i\u015flevi ger\u00e7ekle\u015ftirmekteyken, 2. haneler de\u011fi\u015fkenlik g\u00f6stermektedir. Bu da i\u015flemin o anki \u00f6zel de\u011fi\u015fken durumunu g\u00f6stermektedir. Haliyle komple davran\u0131\u015f de\u011fi\u015fmemekte, davran\u0131\u015f\u0131n bir k\u0131sm\u0131 de\u011fi\u015fmektedir. O y\u00fczden Template Method Design Pattern&#8217;i tercih etmekteyiz, aksi taktirde <a href=\"http:\/\/www.gencayyildiz.com\/blog\/c-strategy-design-patternstrateji-tasarim-deseni\/\" target=\"_blank\">Strategy Design Pattern<\/a>&#8216;i ile durumu de\u011ferlendiriyor olurduk.<\/p>\n<blockquote><p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/c-strategy-design-patternstrateji-tasarim-deseni\/\" target=\"_blank\">Strategy Design Pattern<\/a>&#8216;i davran\u0131\u015f\u0131n tamamen de\u011fi\u015fti\u011fi durumlarda, Template Method Design Pattern&#8217;i ise davran\u0131\u015f\u0131n bir k\u0131sm\u0131 de\u011fi\u015fti\u011fi durumlarda kullan\u0131l\u0131r.<\/p><\/blockquote>\n<p>Burada dikkat etmemiz gereken nokta, Strategy Design Pattern ile fazladan ayn\u0131 i\u015fi yapacak olan algoritmik \u00e7al\u0131\u015fma ger\u00e7ekle\u015ftirmektense, var olan kod par\u00e7alar\u0131n\u0131n yeniden kullan\u0131labilirli\u011finin artt\u0131r\u0131lmas\u0131nda(<em>Code Reusability<\/em>) da tercih edildi\u011fi g\u00f6r\u00fclmektedir.<\/p>\n<h3>Peki Nas\u0131l Bir Mant\u0131kla Template Metod Tasar\u0131m Deseni Uygulanmaktad\u0131r?<\/h3>\n<p>Yapmam\u0131z gereken \u00e7ok basittir. Algoritman\u0131n soyut s\u0131n\u0131flar \u00fczerinden belirlenerek, somut s\u0131n\u0131flarda de\u011fi\u015fmesine olanak sa\u011flamam\u0131z yeterli olacakt\u0131r.<\/p>\n<div id=\"attachment_4635\" style=\"width: 613px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/07\/C-Template-Method-Design-PatternTemplate-Method-Tasar\u0131m-Deseni.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-4635\" class=\"wp-image-4635 size-full\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/07\/C-Template-Method-Design-PatternTemplate-Method-Tasar\u0131m-Deseni.png\" alt=\"C# Template Method Design Pattern(Template Method Tasar\u0131m Deseni)\" width=\"603\" height=\"355\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/07\/C-Template-Method-Design-PatternTemplate-Method-Tasar\u0131m-Deseni.png 603w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/07\/C-Template-Method-Design-PatternTemplate-Method-Tasar\u0131m-Deseni-300x177.png 300w\" sizes=\"auto, (max-width: 603px) 100vw, 603px\" \/><\/a><p id=\"caption-attachment-4635\" class=\"wp-caption-text\">Bu resim www.buraksenyurt.com sitesinden al\u0131nm\u0131\u015ft\u0131r.<\/p><\/div>\n<p>Yukar\u0131daki \u015fablonu incelerseniz e\u011fer Abstract Class i\u00e7erisinde &#8220;TemplateMethod&#8221; metodu mevcuttur. \u0130\u015fte as\u0131l kurgu bu metod \u00fczerine yo\u011funla\u015fmaktad\u0131r. Uygulamada OperationZ, OperationA, OperationY, OperationF ve OperationB gibi metodlar\u0131n oldu\u011funu varsayal\u0131m ve bu metodlar\u0131n s\u0131ral\u0131 operasyonlar \u015feklinde &#8220;TemplateMethod&#8221; i\u00e7erisinde seyredece\u011fini d\u00fc\u015f\u00fcnelim. Lakin dikkat ederseniz Concrete Class&#8217;lar OperationA ve OperationB metodlar\u0131n\u0131 uygulamakta ve s\u0131ral\u0131 operasyondaki \u00f6zel durumu kendilerine g\u00f6re farkl\u0131 bir \u015fekilde yeniden in\u015fa etmektedirler.<\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi yukar\u0131daki \u015femada Template(\u015eablon) metod i\u015flevini &#8220;TemplateMethod&#8221; isimli yordam \u00fcstlenmektedir.<\/p>\n<p>\u015eimdi gelin, bu senaryodaki akt\u00f6rleri tan\u0131yal\u0131m.<\/p>\n<ul>\n<li><strong><em>Abstract Class<\/em><\/strong><br \/>\nTemplate Metodu ve algoritmadaki s\u0131ral\u0131 operasyonlar\u0131 fiziksel olarak bar\u0131nd\u0131ran soyut s\u0131n\u0131ft\u0131r.\n<\/li>\n<li>\n<strong><em>Concrete Class<\/em><\/strong><br \/>\nOperasyonlardan override edilecek olanlar\u0131n uyguland\u0131\u011f\u0131 s\u0131n\u0131flard\u0131r.\n<\/li>\n<\/ul>\n<h3>\u00d6rnek Senaryo Uygulamas\u0131<\/h3>\n<p>\u015eimdi a\u015fa\u011f\u0131daki gibi bir senaryo \u00fczerinde Template Method D.P. uygulamas\u0131n\u0131 ger\u00e7ekle\u015ftirece\u011fiz.<\/p>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/07\/C-Template-Method-Design-PatternTemplate-Method-Tasar\u0131m-Deseni-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/07\/C-Template-Method-Design-PatternTemplate-Method-Tasar\u0131m-Deseni-2-275x300.png\" alt=\"C# Template Method Design Pattern(Template Method Tasar\u0131m Deseni)\" width=\"275\" height=\"300\" class=\"aligncenter size-medium wp-image-4649\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/07\/C-Template-Method-Design-PatternTemplate-Method-Tasar\u0131m-Deseni-2-275x300.png 275w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/07\/C-Template-Method-Design-PatternTemplate-Method-Tasar\u0131m-Deseni-2.png 466w\" sizes=\"auto, (max-width: 275px) 100vw, 275px\" \/><\/a><br \/>\nSenaryomuz; bir al\u0131\u015fveri\u015f senaryosu olacakt\u0131r ve  al\u0131nan \u00fcr\u00fcne g\u00f6re \u00f6zel durumlar\u0131m\u0131z de\u011fi\u015fecektir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    enum OdemeTipi\r\n    {\r\n        Pesin, Taksit\r\n    }\r\n\r\n    abstract class Alisveris\r\n    {\r\n        protected string UrunAdi;\r\n        protected OdemeTipi odemeTipi;\r\n        void Baslat() =&gt; Console.WriteLine(&quot;Al\u0131\u015fveri\u015f ba\u015flad\u0131.&quot;);\r\n        void Bitir() =&gt; Console.WriteLine($&quot;Al\u0131\u015fveri\u015f bitti.{UrunAdi} {odemeTipi} y\u00f6ntemiyle al\u0131nm\u0131\u015ft\u0131r.&quot;);\r\n        abstract public void Urun();\r\n        abstract public void OdemeSekli();\r\n        public void TemplateMethod()\r\n        {\r\n            Baslat();\r\n            Urun();\r\n            OdemeSekli();\r\n            Bitir();\r\n        }\r\n    }\r\n<\/pre>\n<p>Bu bizim soyut s\u0131n\u0131f\u0131m\u0131zd\u0131r. \u0130ncelerseniz e\u011fer, Baslat ve Bitir metodlar\u0131 algoritman\u0131n sabit i\u015flevleridirler. Lakin Urun ve OdemeSekli metodlar\u0131 ise \u00f6zel de\u011fi\u015fkenlik g\u00f6steren durumlar te\u015fkil etmektedir. O y\u00fczden abstract ile i\u015faretlenerek soyut metod haline getirilmi\u015flerdir ve inherit edilen s\u0131n\u0131f taraf\u0131nda uygulanacaklar ve i\u00e7erikleri doldurulacakt\u0131rlar. Ayriyetten TemplateMethod metodumuzda s\u0131ral\u0131 operasyonlar yerle\u015ftirilmi\u015ftir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Televizyon : Alisveris\r\n    {\r\n        public override void OdemeSekli()\r\n        {\r\n            odemeTipi = OdemeTipi.Pesin;\r\n        }\r\n\r\n        public override void Urun()\r\n        {\r\n            UrunAdi = &quot;Televizyon&quot;;\r\n        }\r\n    }\r\n\r\n    class Buzdolabi : Alisveris\r\n    {\r\n        public override void OdemeSekli()\r\n        {\r\n            odemeTipi = OdemeTipi.Taksit;\r\n        }\r\n\r\n        public override void Urun()\r\n        {\r\n            UrunAdi = &quot;Buzdolab\u0131&quot;;\r\n        }\r\n    }\r\n<\/pre>\n<p>Bunlarda bizim Concrete Class&#8217;lar\u0131m\u0131zd\u0131r. G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi \u00f6zel de\u011fi\u015fkenlik durumlar\u0131n\u0131 ifade eden metodlarda Concrete&#8217;e g\u00f6re i\u00e7erik olu\u015fturmu\u015f olduk. Haliyle s\u0131ral\u0131 operasyonlar bu yap\u0131lan yeniliklere g\u00f6re ceyran edecektir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Program\r\n    {\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            Alisveris a1 = new Televizyon();\r\n            a1.TemplateMethod();\r\n            Console.WriteLine(&quot;***********&quot;);\r\n            Alisveris a2 = new Buzdolabi();\r\n            a2.TemplateMethod();\r\n\r\n            Console.Read();\r\n        }\r\n    }\r\n<\/pre>\n<p>Son olarak Client taraf\u0131nda yukar\u0131daki gibi bir \u00f6rneklendirme ger\u00e7ekle\u015ftirebiliriz. Haliyle projemizi derleyip \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131z zaman a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcyle benzer sonu\u00e7 elde edilecektir.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/07\/C-Template-Method-Design-PatternTemplate-Method-Tasar\u0131m-Deseni-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/07\/C-Template-Method-Design-PatternTemplate-Method-Tasar\u0131m-Deseni-1-300x92.png\" alt=\"C# Template Method Design Pattern(Template Method Tasar\u0131m Deseni)\" width=\"300\" height=\"92\" class=\"aligncenter size-medium wp-image-4646\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/07\/C-Template-Method-Design-PatternTemplate-Method-Tasar\u0131m-Deseni-1-300x92.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/07\/C-Template-Method-Design-PatternTemplate-Method-Tasar\u0131m-Deseni-1.png 478w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Evet, g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi algoritmada k\u0131smi de\u011fi\u015fikli\u011fe ihtiya\u00e7 oldu\u011fu durumlarda Template Method Design Pattern kullan\u0131lmaktad\u0131r. Unutmamal\u0131d\u0131r ki, yukar\u0131da da bahsetti\u011fimiz gibi komple algoritmik de\u011fi\u015fiklik s\u00f6z konusu oldu\u011fu zamanlarda <a href=\"http:\/\/www.gencayyildiz.com\/blog\/c-strategy-design-patternstrateji-tasarim-deseni\/\" target=\"_blank\">Strategy Design Pattern<\/a>&#8216;i kullanmak daha makbuld\u00fcr.<\/p>\n<p>Sizler de algoritman\u0131n belli oldu\u011fu fakat baz\u0131 noktalar\u0131nda algoritma de\u011fi\u015fikli\u011fi gerekti\u011fi durumlarda Template Method D.P.&#8217;i kullanmaya \u00f6zen g\u00f6steriniz.<\/p>\n<p>Okudu\u011funuz i\u00e7in te\u015fekk\u00fcr ederim&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#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, Behavioral Patterns(Davran\u0131\u015fsal Kal\u0131plar) kategorisinde bulunan Template Method Design Pattern \u00fczerine i\u00e7erik olu\u015fturaca\u011f\u0131z. Template, kelime manas\u0131ndan da anla\u015f\u0131laca\u011f\u0131 \u00fczere \u015fablon demektir. Haliyle yapt\u0131\u011f\u0131m\u0131z faaliyetin in\u015fas\u0131nda belirli \u015fablonsal algorimalar \u00fczerinde \u00e7al\u0131\u015fma ger\u00e7ekle\u015ftirecek ve bu algoritmada&#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":4635,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[153],"tags":[1307,1052,1306,1308,1053,750,1054,928,1304,1303,1305],"class_list":["post-4521","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-design-pattern","tag-abstract-class","tag-behavioral-patterns","tag-code-reusability","tag-concrete-class","tag-davranissal-kaliplar","tag-design-pattern","tag-strategy-design-pattern","tag-tasarim-deseni","tag-template-method","tag-template-method-design-pattern","tag-template-method-tasarim-deseni"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4521","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=4521"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4521\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/4635"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=4521"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=4521"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=4521"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}