﻿
{"id":19758,"date":"2020-12-12T21:37:09","date_gmt":"2020-12-12T21:37:09","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=19758"},"modified":"2020-12-12T21:38:07","modified_gmt":"2020-12-12T21:38:07","slug":"c-decorator-design-patterndecorator-tasarim-deseni","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-decorator-design-patterndecorator-tasarim-deseni\/","title":{"rendered":"C# Decorator Design Pattern(Decorator Tasar\u0131m Deseni)"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde mevcudiyette var olan bir class&#8217;a mimarisel yeni bir nitelik kazand\u0131rmam\u0131z\u0131 sa\u011flayacak olan, Structural Pattern(Yap\u0131sal Desenler)&#8217;lerden <em>Decorator Design Pattern(Decorator Tasar\u0131m Deseni)<\/em> \u00fczerine konu\u015fuyor olaca\u011f\u0131z.<\/p>\n<p>Yaz\u0131l\u0131m mimarilerinde temel esas, m\u00fcmk\u00fcn mertebe birbirlerinden soyutlanm\u0131\u015f yap\u0131lar\u0131n gev\u015fek ba\u011fl\u0131l\u0131\u011f\u0131(loose coupling) sa\u011flayarak ortaya koydu\u011fu geli\u015ftirmeye dayanmaktad\u0131r. Bu geli\u015ftirme s\u00fcrecinde var olan s\u0131n\u0131flar\u0131m\u0131zdaki bir metodun niteli\u011fini de\u011fi\u015ftirme ihtiyac\u0131 hissedildi\u011fi zaman bu ihtiyac\u0131 kodu bozmaks\u0131z\u0131n, dinamik bir \u015fekilde giderebilmemiz gerekmektedir. \u0130\u015fte b\u00f6yle bir durumda, kurulmu\u015f d\u00fczeni bozmadan, mimarisel yap\u0131lanman\u0131n temellerini oynatmadan bir metodun niteli\u011fini geni\u015fletmek i\u00e7in Decorator tasar\u0131m deseninden faydalanabiliriz.<\/p>\n<p>\u0130lk olarak genel bir yanl\u0131\u015f anla\u015f\u0131lmadan ba\u015flamak istiyorum. Decorator pattern&#8217;inin genellikle bir class&#8217;a yeni bir \u00f6zellik\/member\/metot vs. eklemeye yarad\u0131\u011f\u0131 d\u00fc\u015f\u00fcn\u00fclmektedir. Halbuki Decorator pattern, hali haz\u0131rda var olan bir s\u0131n\u0131f\u0131n mevcudiyetteki metodunun i\u015flevini geni\u015fletmek i\u00e7in vard\u0131r.<\/p>\n<blockquote><p><em style=\"color: orange;\">Decorator pattern, bir class&#8217;a metot eklemek i\u00e7in de\u011fil, var olan bir s\u0131n\u0131f\u0131n mevcudiyetteki metodunun i\u015flevini geni\u015fletmek i\u00e7in kullan\u0131lan bir desendir.<\/em><\/p><\/blockquote>\n<p>Bu durumu i\u00e7eri\u011fimizin seyrinde masaya yat\u0131raca\u011f\u0131m\u0131z senaryolar e\u015fli\u011finde zaten \u00f6rneklendirece\u011fiz. \u015eimdi hangi durumlarda bu desene ihtiya\u00e7 duydu\u011fumuzu daha da a\u00e7al\u0131m.<\/p>\n<h3 style=\"color: #e83e8c;\">Decorator Deseni Ne Zaman Kullan\u0131l\u0131r?<\/h3>\n<p><span style=\"font-size: 10px;\">&#8211; \u015euayip abi : Yaz\u0131l\u0131m nedir m\u00fcd\u00fcr?<\/span><br \/>\n<span style=\"font-size: 10px;\">&#8211; Sokrates : Yaz\u0131l\u0131m de\u011fi\u015fimdir \u015euayipci\u011fim&#8230;<\/span><\/p>\n<p>Evet&#8230; <em>Yaz\u0131l\u0131m nedir?<\/em> sorusuna verilebilecek en g\u00fczel cevap san\u0131r\u0131m de\u011fi\u015fim olacakt\u0131r. Bir probleme sunulan \u00e7\u00f6z\u00fcm\u00fcn, bazen k\u00e2h problemin de\u011fi\u015fmesinden bazen de k\u00e2h problemden \u00f6te ihtiya\u00e7lar\u0131n de\u011fi\u015fmesinden dolay\u0131 s\u00fcrekli g\u00fcncellenmesi gerekebilmektedir. Hatta, her ne kadar iyi bir mimarisel tasar\u0131m ger\u00e7ekle\u015ftirirsek ger\u00e7ekle\u015ftirelim, yeni do\u011facak ihtiya\u00e7lara binaen yap\u0131lmas\u0131 gerekecek olan de\u011fi\u015fiklikler bizleri y\u0131ld\u0131rabilecek seviyede olabilmekte ve hatta mimarisel yakla\u015f\u0131mlardan uzakla\u015ft\u0131r\u0131p, spagetti \u00e7\u00f6z\u00fcmlere bile sevkedebilmektedir.<\/p>\n<p>Esas\u0131nda bu durumun, do\u011fal bir s\u00fcrecin \u00f6n\u00fcne ge\u00e7ilemeyen bir par\u00e7as\u0131 oldu\u011funun fark\u0131nda olunmas\u0131 gerekir. \u0130\u015f hayat\u0131nda geli\u015ftirilen yaz\u0131l\u0131mlar\u0131n seyrini; ihtiya\u00e7lar, \u015fartlar, de\u011fi\u015fken durumlar ve son kullan\u0131c\u0131lar\u0131n beklentisi belirledi\u011fi s\u00fcreci bu <u>de\u011fi\u015fiklik<\/u> olgusu her daim hayat\u0131m\u0131z\u0131n bir par\u00e7as\u0131 olacakt\u0131r. Bizlere d\u00fc\u015fen bu olguyla kar\u015f\u0131la\u015ft\u0131\u011f\u0131m\u0131zda onu pani\u011fe kap\u0131lmaks\u0131z\u0131n kar\u015f\u0131layabilmek ve evrensel bir \u00e7\u00f6z\u00fcmle uygulaman\u0131n yeni ihtiya\u00e7lara olan adaptasyonunu sa\u011flayabilmektir.<\/p>\n<p>\u015eimdi olay\u0131 biraz daha teknik boyuta indirgeyerek devam edelim. Geli\u015ftirilen yaz\u0131l\u0131mlarda mevcut bir i\u015flemi \u00fcstlenen s\u0131n\u0131flar ve o s\u0131n\u0131flar i\u00e7erisinde operasyonlar\u0131 y\u00fcr\u00fcten metotlar olu\u015fturulduktan sonra ilgili metotlar\u0131n i\u015flevselli\u011fine dair olan beklentinin artmas\u0131 olduk\u00e7a do\u011fald\u0131r. S\u00fcre\u00e7te metotlar\u0131n sat\u0131r say\u0131lar\u0131 gittik\u00e7e uzayabilir, son halleri ilk hallerinden olduk\u00e7a alakas\u0131z bir sorumlulu\u011fa do\u011fru evrilebilir.<\/p>\n<p>Genelde yaz\u0131l\u0131mc\u0131lar, olu\u015fturduklar\u0131 tasar\u0131mlar\u0131na yeni eklemelerin gelmesiyle <a href=\"https:\/\/www.gencayyildiz.com\/blog\/tek-sorumluluk-prensibisingle-responsibility-principle-srp\/\" target=\"_blank\" rel=\"noopener noreferrer\">tek sorumluluk prensibine<\/a> tamamen ayk\u0131r\u0131 \u00e7\u00f6z\u00fcmler \u00fcretirler. Nihayetinde sistem art\u0131k yeni \u00f6zellikler bar\u0131nd\u0131rmak ve var olan metotlarda i\u015flevselliklerini daha da artt\u0131rmak isteyecektir. B\u00f6yle bir durumda \u00e7\u00f6z\u00fcm olarak sistemin aray\u00fczlerine yeni imzalar ekleyerek gelecek \u00f6zellikleri kar\u015f\u0131layabilmekte m\u00fcmk\u00fcnd\u00fcr lakin bu sefer de aray\u00fczleri \u015fi\u015firmenin sonucunda <a href=\"https:\/\/www.gencayyildiz.com\/blog\/arayuz-ayrim-prensibiinterface-segregation-principle-isp\/\" target=\"_blank\" rel=\"noopener noreferrer\">aray\u00fcz ayr\u0131m prensibine<\/a> ayk\u0131r\u0131 hareket edilmi\u015f olacakt\u0131r. Hem ayn\u0131 aray\u00fczden t\u00fcreyen kimi nesneler i\u00e7in yeni \u00f6zellikler istenirken, kimisi i\u00e7inde istenmeyebilir. Bu durumda aray\u00fcz\u00fc geni\u015fletmek dummy code&#8217;a da sebebiyet verebilecektir, ihtimaldir.<\/p>\n<p>\u0130\u015fte bu ahvalde sistemi bozmadan ve prensiplere ayk\u0131r\u0131 olmadan mimarideki metotlar\u0131n niteliklerini artt\u0131rabilmek ve sistemi geni\u015fletebilmek i\u00e7in daha efektif bir stratejiye ihtiya\u00e7 vard\u0131r&#8230;<\/p>\n<blockquote><p><em style=\"color: purple;\">Hali haz\u0131rdaki bir sistemin geni\u015flemesi gerekti\u011fi durumlarda Decorator deseni bi\u00e7ilmi\u015f kaftand\u0131r.<\/em><\/p><\/blockquote>\n<h3 style=\"color: #e83e8c;\">Decorator Deseni Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h3>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/C-Decorator-Design-PatternDecorator-Tasarim-Deseni.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-19759\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/C-Decorator-Design-PatternDecorator-Tasarim-Deseni.png\" alt=\"C# Decorator Design Pattern(Decorator Tasar\u0131m Deseni)\" width=\"629\" height=\"326\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/C-Decorator-Design-PatternDecorator-Tasarim-Deseni.png 629w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/C-Decorator-Design-PatternDecorator-Tasarim-Deseni-300x155.png 300w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><\/a><br \/>\nDecorator deseni, bir interface&#8217;de imzas\u0131 tan\u0131mlanm\u0131\u015f herhangi bir metodun i\u015flevini daha da geni\u015fletebilmek i\u00e7in ilgili interface&#8217;den t\u00fcreyen bir s\u0131n\u0131ftan ibarettir. Bu s\u0131n\u0131f, ilgili interface&#8217;den t\u00fcredi\u011fi gibi biryandan da geni\u015fle\u015fme operasyonunu yapaca\u011f\u0131 metodun bulundu\u011fu s\u0131n\u0131f\u0131 kar\u015f\u0131layabilmek i\u00e7in ilgili s\u0131n\u0131fa ait bir ba\u011f\u0131ml\u0131l\u0131k yani referans bar\u0131nd\u0131r\u0131r. Buradaki tasar\u0131m\u0131 anlamland\u0131rabilmek i\u00e7in yukar\u0131daki diyagram bize yard\u0131mc\u0131 olacakt\u0131r;<\/p>\n<ul>\n<li><strong><em>Component<\/em><\/strong><br \/>\nGeni\u015fletilecek ve yeni \u00f6zellikler eklenecek olan metodun imzas\u0131n\u0131 bar\u0131nd\u0131ran interface&#8217;e kar\u015f\u0131l\u0131k gelmektedir. Bir ba\u015fka deyi\u015fle sistem aray\u00fcz\u00fcd\u00fcr.<\/li>\n<li><strong><em>ConcreteComponent<\/em><\/strong><br \/>\nSistem aray\u00fcz\u00fcn\u00fc ger\u00e7ekleyen\/implemente eden somut s\u0131n\u0131flardan birisidir.<\/li>\n<li><strong><em>Operation<\/em><\/strong><br \/>\nGeni\u015fletilecek ve yeni \u00f6zellikler eklenecek olan metodun ta kendisidir.<\/li>\n<li><strong><em>Decorator<\/em><\/strong><br \/>\nSistemin aray\u00fcz\u00fcn\u00fc uygulayan ve i\u00e7erisinde &#8216;ConcreteComponent&#8217;a eri\u015fim sa\u011flayabilmesi i\u00e7in sistem aray\u00fcz\u00fcn\u00fcn bir referans\u0131n\u0131 bar\u0131nd\u0131ran s\u0131n\u0131ft\u0131r.<\/li>\n<li><strong><em>ConcreteDecoratorA&amp;ConcreteDecoratorB<\/em><\/strong><br \/>\nDecorator s\u0131n\u0131f\u0131ndan t\u00fcretilen s\u0131n\u0131flard\u0131r. Sistemdeki Operation metoduna eklemeyi d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm\u00fcz yenilikleri\/nitelikleri bar\u0131nd\u0131r\u0131r.<\/li>\n<\/ul>\n<p>Bu stratejide; &#8216;Decorator&#8217;, &#8216;ConcreteComponent&#8217;te geni\u015fletilecek olan &#8216;Operation&#8217; metodunu &#8216;Component&#8217; aray\u00fcz\u00fc sayesinde kendisine uygulayacak ve kendisinden t\u00fcreyen &#8216;ConcreteDecoratorA&#8217; ve &#8216;ConcreteDecoratorB&#8217; s\u0131n\u0131flar\u0131na override edilebilir bir vaziyette yani virtual olarak kal\u0131tsal aktaracakt\u0131r. Ayr\u0131ca bar\u0131nd\u0131raca\u011f\u0131 &#8216;Component&#8217; referans\u0131 sayesinde \u00fczerinde de\u011fi\u015fiklik yap\u0131lacak &#8216;ConcreteComponent&#8217; nesnesini de alt decorator&#8217;lere g\u00f6nderecektir. \u0130\u015fte bu s\u0131n\u0131flarda yap\u0131lmas\u0131 beklenen t\u00fcm de\u011fi\u015fiklikler, yenilikler, geli\u015ftirmeler ve davran\u0131\u015flar ilgili metoda uygulanacakt\u0131r. Diyagrama g\u00f6z atarsan\u0131z e\u011fer; &#8216;ConcreteDecoratorA&#8217; dekorat\u00f6r\u00fcnde &#8216;ConcreteComponent&#8217; nesnesindeki &#8216;Operation&#8217; fonksiyonunun \u00f6nceli\u011fine &#8216;addedState&#8217; niteli\u011fini eklemekte, &#8216;ConcreteDecoratorB&#8217;de ise ilgili fonksiyonun yine \u00f6nceli\u011fine &#8216;addedState&#8217; ile birlikte sonras\u0131na &#8216;AddedBehavior&#8217; nitelikleri eklenmektedir. B\u00f6ylece her iki decorator&#8217;de beklenen de\u011fi\u015fiklikler ger\u00e7ekle\u015ftirilmi\u015f ve ilgili metot geni\u015fletilmi\u015f olmaktad\u0131r.<\/p>\n<blockquote><p><em>Decorator deseni ihtiyaca binaen hem sistemi geni\u015fletmekte hem de <a href=\"https:\/\/www.gencayyildiz.com\/blog\/tek-sorumluluk-prensibisingle-responsibility-principle-srp\/\" target=\"_blank\" rel=\"noopener noreferrer\">tek sorumluluk prensibi<\/a> ile <a href=\"https:\/\/www.gencayyildiz.com\/blog\/arayuz-ayrim-prensibiinterface-segregation-principle-isp\/\" target=\"_blank\" rel=\"noopener noreferrer\">aray\u00fcz ayr\u0131m prensibi<\/a><\/em> e\u015fli\u011finde soruna \u00e7\u00f6z\u00fcm getirmektedir.<\/p><\/blockquote>\n<h3 style=\"color: #e83e8c;\">\u00d6rnek Senaryolar<\/h3>\n<p>\u015eimdi Decorator tasar\u0131m desenini \u00fc\u00e7 farkl\u0131 senaryo \u00fczerinden \u00f6rneklendirelim;<\/p>\n<h4 style=\"color: purple;\">Senaryo 1<\/h4>\n<p>Bu senaryomuzda <a href=\"https:\/\/www.gencayyildiz.com\/blog\/c-repository-design-patternrepository-tasarim-deseni\/\" target=\"_blank\" rel=\"noopener noreferrer\">Repository tasar\u0131m deseni<\/a> \u00fczerinden seyredece\u011fiz. Uygulamada hali haz\u0131rda geli\u015ftirilmi\u015f olan repository deseni \u00fczerinden veritaban\u0131 i\u015flemlerinin ba\u015far\u0131yla ger\u00e7ekle\u015ftirildi\u011fini ve ihtiyaca binaen ilgili tasar\u0131m ile t\u00fcm sorgular\u0131 t\u0131k\u0131r t\u0131k\u0131r \u00fcretti\u011fimizi ve istedi\u011fimiz veriyi istedi\u011fimiz modelde elde edebildi\u011fimizi d\u00fc\u015f\u00fcnelim&#8230; Her \u015fey yolunda&#8230; Her \u015fey m\u00fckemmel&#8230; derkeennnn, zaman gelip \u00e7atar ve ka\u00e7\u0131n\u0131lmaz ger\u00e7ekle y\u00fczle\u015filir! \u0130\u015f birimindeki geli\u015ftiricilerden gelen istekler kap\u0131y\u0131 \u00e7alar ve a\u015fa\u011f\u0131daki de\u011fi\u015fiklik talepleriyle d\u00f6\u015fenmi\u015f raylar bo\u015fa \u00e7\u0131kar&#8230;<\/p>\n<ul>\n<li><em>Select i\u015fleminden \u00f6nce g\u00fcvenlik kontrol\u00fc yap\u0131ls\u0131n ard\u0131ndan select i\u015flemi ger\u00e7ekle\u015ftirilsin,<\/em><\/li>\n<li><em>Herhangi bir kay\u0131t eklendi\u011finde, silindi\u011finde yahut g\u00fcncellendi\u011finde i\u015flemden sonra gerekli loglar tutulsun,<\/em><\/li>\n<li><em>Herhangi bir kay\u0131t silindi\u011finde veya g\u00fcncellendi\u011finde CRM veritaban\u0131na API&#8217;lar arac\u0131l\u0131\u011f\u0131yla ba\u011flan\u0131larak ayn\u0131 de\u011fi\u015fiklikler orayada yans\u0131t\u0131ls\u0131n,<\/em><\/li>\n<li><em>Herhangi bir kay\u0131t g\u00fcncellendi\u011finde kim taraf\u0131ndan hangi tarihte yap\u0131ld\u0131\u011f\u0131na dair y\u00f6neticiye mail g\u00f6nderilsin.<\/em><\/li>\n<\/ul>\n<div id=\"attachment_19827\" style=\"width: 160px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/saskin2.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-19827\" class=\"size-thumbnail wp-image-19827\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/saskin2-150x150.jpg\" alt=\"\" width=\"150\" height=\"150\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/saskin2-150x150.jpg 150w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/saskin2-160x160.jpg 160w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/a><p id=\"caption-attachment-19827\" class=\"wp-caption-text\">Neeyyy<\/p><\/div>\n<p>Her\u015feyi tam teferruat\u0131yla tamamlad\u0131\u011f\u0131n\u0131z\u0131 d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcn\u00fcz repository tasar\u0131m\u0131n\u0131z\u0131n \u00fczerine b\u00f6yle bir istek ya\u011fmuru geldi\u011fini d\u00fc\u015f\u00fcn\u00fcrseniz e\u011fer muhtemelen bir\u00e7o\u011funuz isyan edecektir. Hele hele i\u015f birimlerinden gelen bu tarz talepler, sanki kurulan d\u00fczene kar\u015f\u0131 bir diren\u00e7 olu\u015fturmak ve biz yaz\u0131l\u0131m geli\u015ftiricilerine s\u0131rf i\u015f \u00e7\u0131karmak i\u00e7in kas\u0131tl\u0131 bir \u00f6rg\u00fct misali hareket ediyormu\u015fcas\u0131na da alg\u0131lanmas\u0131 yan\u0131nda cabas\u0131 olacakt\u0131r.<\/p>\n<div id=\"attachment_19833\" style=\"width: 160px\" class=\"wp-caption alignright\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/kizgin.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-19833\" class=\"size-thumbnail wp-image-19833\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/kizgin-150x150.jpg\" alt=\"\" width=\"150\" height=\"150\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/kizgin-150x150.jpg 150w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/kizgin-160x160.jpg 160w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/a><p id=\"caption-attachment-19833\" class=\"wp-caption-text\">Hay yapaca\u011f\u0131n\u0131z iste\u011fin!<\/p><\/div>\n<p>Evet&#8230; Bu tarz istekler onca i\u015f onca tasar\u0131m\u0131n temellerini oynatacak mahiyette olabilmekte ve bundan dolay\u0131 psikolojik gerginliklere bile sebebiyet verebilmektedir. Hatta hakl\u0131 olabilece\u011finizi d\u00fc\u015f\u00fcnerekten <em>&#8216;ulan ba\u015fta s\u00f6yleseydiniz ya!&#8217;<\/em> \u015feklinde tepkiler bile verebilirsiniz. Amma velakin bu durumda pekte hakl\u0131 olaca\u011f\u0131n\u0131z kanaatinde de\u011filim. Nihayetinde yukar\u0131daki sat\u0131rlarda de\u011findi\u011fimiz gibi yaz\u0131l\u0131m s\u00fcrecinde <u>de\u011fi\u015fiklik<\/u> esast\u0131r ve bir yaz\u0131l\u0131mc\u0131 olarak bu de\u011fi\u015fikliklere her daim haz\u0131r ve a\u00e7\u0131k olman\u0131z gerekmektedir.<\/p>\n<div id=\"attachment_19835\" style=\"width: 160px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/korkak.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-19835\" class=\"size-thumbnail wp-image-19835\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/korkak-150x150.jpg\" alt=\"\" width=\"150\" height=\"150\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/korkak-150x150.jpg 150w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/korkak-160x160.jpg 160w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/a><p id=\"caption-attachment-19835\" class=\"wp-caption-text\">Hass&#8230;<\/p><\/div>\n<p>Dolay\u0131s\u0131yla b\u00f6yle bir durumun verdi\u011fi tansiyon t\u00fcm mimariyi alt \u00fcst edecek endi\u015fesine kap\u0131lman\u0131z\u0131 sa\u011flayabilir ve korkuyla, kara kara d\u00fc\u015f\u00fcnmenize bile sebebiyet verebilir&#8230; Akl\u0131n\u0131zdan <em>if-else ile mi \u00e7\u00f6zsek?<\/em> ya da <em>farkl\u0131 bir repository&#8217;mi tasarlasak<\/em> gibi fikirleri ge\u00e7iriyor olabilir lakin sonras\u0131nda i\u015f birimlerinden gelebilecek sonraki istek ihtimallerini d\u00fc\u015f\u00fcnerek, ilgili isteklerin \u015fu tabloda olsun, bu tabloda olmas\u0131n gibisinden sa\u00e7ma sapan detayl\u0131lar\u0131 olabilece\u011fi ihtimalinden dolay\u0131 vaz ge\u00e7ip iyice karamsarl\u0131\u011fa kap\u0131labilirsiniz. <em>&#8230;Ulan ne g\u00fczelde kodlam\u0131\u015ft\u0131m, \u015fimdi nereden \u00e7\u0131kt\u0131 bu!&#8230;<\/em><\/p>\n<div id=\"attachment_19841\" style=\"width: 160px\" class=\"wp-caption alignright\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/buldum.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-19841\" class=\"size-thumbnail wp-image-19841\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/buldum-150x150.jpg\" alt=\"\" width=\"150\" height=\"150\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/buldum-150x150.jpg 150w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/buldum-160x160.jpg 160w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/a><p id=\"caption-attachment-19841\" class=\"wp-caption-text\">\u0130\u015fte buldum<\/p><\/div>\n<p>Hay\u0131r! Korkmay\u0131n&#8230; \u0130\u015fte tamda b\u00f6yle bir ahvalde, var olan repository deseni \u00fczerinde istenilen de\u011fi\u015fiklikleri mimari temellerine zerre dokunmaks\u0131z\u0131n ger\u00e7ekle\u015ftirebilmek ve i\u015f birimlerine sunabilmek i\u00e7in Decorator deseni bi\u00e7ilmi\u015f kaftan misali yeti\u015fecek ve probleme \u00e7\u00f6z\u00fcm getirecektir.<\/p>\n<p>\u015eimdi gelin \u00f6rneklendirmede kullanaca\u011f\u0131m\u0131z repository&#8217;nin ilk ba\u015flardaki kodunu inceleyelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Repository&lt;T&gt; : IRepository&lt;T&gt; where T : class\r\n    {\r\n        public T Get(int id)\r\n        {\r\n            Console.WriteLine(&quot;Id bazl\u0131 veri \u00e7ekildi.&quot;);\r\n            return null;\r\n        }\r\n        public T GetAll()\r\n        {\r\n            Console.WriteLine(&quot;T\u00fcm veriler \u00e7ekildi.&quot;);\r\n            return null;\r\n        }\r\n        public void Add(T model)\r\n        {\r\n            Console.WriteLine(&quot;Model eklendi.&quot;);\r\n        }\r\n        public void Delete(T model)\r\n        {\r\n            Console.WriteLine(&quot;Model silindi.&quot;);\r\n        }\r\n        public void Update(T model)\r\n        {\r\n            Console.WriteLine(&quot;Model g\u00fcncellendi.&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>Ba\u015flarda bu \u015fekilde tasarlanm\u0131\u015f olan ve s\u00fcre\u00e7te i\u015f birimlerinden gelen istekler neticesinde de\u011fi\u015fiklik gerektirecek metotlar\u0131 bar\u0131nd\u0131ran repository s\u0131n\u0131f\u0131n\u0131n kodu yukar\u0131daki gibidir. Decorator tasar\u0131m deseni a\u00e7\u0131s\u0131ndan bu s\u0131n\u0131f &#8216;ConcreteComponent&#8217;a kar\u015f\u0131l\u0131k gelmektedir. Yani i\u015flevini geni\u015fletmek gereken metotlar\u0131 bar\u0131nd\u0131ran s\u0131n\u0131fa&#8230;<\/p>\n<p>Bizler \u015fimdi decorator deseni sayesinde bu s\u0131n\u0131f i\u00e7erisindeki &#8216;Select&#8217;, &#8216;Insert&#8217;, &#8216;Update&#8217; ve &#8216;Delete&#8217; sorgular\u0131n\u0131 olu\u015fturan ilgili metotlara istenilen de\u011fi\u015fiklikleri uygulatacak ve gerekli operasyonlar\u0131 ger\u00e7ekle\u015ftirece\u011fiz. Bunun i\u00e7in ilk olarak tasar\u0131mdaki &#8216;Decorator&#8217; s\u0131n\u0131f\u0131n\u0131 olu\u015fturarak ba\u015flayal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Decorator\r\n    class DecoratorRepository&lt;T&gt; : IRepository&lt;T&gt; where T : class\r\n    {\r\n        readonly IRepository&lt;T&gt; _repository;\r\n        public DecoratorRepository(IRepository&lt;T&gt; repository)\r\n        {\r\n            _repository = repository;\r\n        }\r\n        virtual public void Add(T model)\r\n        {\r\n            _repository.Add(model);\r\n        }\r\n        virtual public void Delete(T model)\r\n        {\r\n            _repository.Delete(model);\r\n        }\r\n        virtual public T Get(int id)\r\n        {\r\n            return _repository.Get(id);\r\n        }\r\n        virtual public T GetAll()\r\n        {\r\n            return _repository.GetAll();\r\n        }\r\n        virtual public void Update(T model)\r\n        {\r\n            _repository.Update(model);\r\n        }\r\n    }\r\n<\/pre>\n<p>Decorator deseninde &#8216;Component&#8217;a kar\u015f\u0131l\u0131k gelen &#8216;IRepository&#8217; interface&#8217;inden t\u00fcreyen &#8216;DecoratorRepository&#8217; isimli &#8216;Decorator&#8217; s\u0131n\u0131f\u0131m\u0131z\u0131 olu\u015fturmu\u015f bulunmaktay\u0131z. Dikkat ederseniz bu s\u0131n\u0131f &#8216;Component&#8217;tan yani &#8216;IRepository&#8217;den t\u00fcremekte ve i\u00e7erisinde geni\u015fletme uygulanacak olan &#8216;ConcreteComponent&#8217; nesnesini referans edebilmesi i\u00e7in &#8216;IRepository&#8217; referans\u0131 bar\u0131nd\u0131rmaktad\u0131r. Bir ba\u015fka \u00f6ncemli husus ise &#8216;IRepository&#8217; aray\u00fcz\u00fc ile uygulat\u0131lan metotlar virtual olarak i\u015faretlenmi\u015ftir. Bunun nedeni bu &#8216;Decorator&#8217; s\u0131n\u0131f\u0131ndan as\u0131l de\u011fi\u015fikliklerin sorumlulu\u011funu \u00fcstlenecek olan &#8216;ConcreteDecorator&#8217; s\u0131n\u0131flar\u0131 t\u00fcretilecek ve kal\u0131t\u0131msal aktar\u0131lan bu metotlar\u0131n i\u00e7eri\u011finde ana i\u015flevselliklerinin yan\u0131nda, \u00f6ncesinde ya da sonras\u0131nda istenilen de\u011fi\u015fiklikleri uygulayabilmek i\u00e7in ezilmesi(override) gerekecektir.<\/p>\n<p>\u015eimdi gelin istekleri yerine getiren &#8216;ConcereDecorator&#8217; s\u0131n\u0131flar\u0131n\u0131 s\u0131ras\u0131yla olu\u015ftural\u0131m.<\/p>\n<blockquote><p><em style=\"font-family: 'Comic Sans MS'; font-size: 13px;\">Select i\u015fleminden \u00f6nce g\u00fcvenlik kontrol\u00fc yap\u0131ls\u0131n ard\u0131ndan select i\u015flemi ger\u00e7ekle\u015ftirilsin<\/em><\/p><\/blockquote>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/ConcreteDecorator\r\n    class SecurityRepositoryDecorator&lt;T&gt; : DecoratorRepository&lt;T&gt; where T : class\r\n    {\r\n        readonly IRepository&lt;T&gt; _repository;\r\n        public SecurityRepositoryDecorator(IRepository&lt;T&gt; repository) : base(repository)\r\n        {\r\n            _repository = repository;\r\n        }\r\n        public override T Get(int id)\r\n        {\r\n            Console.WriteLine(&quot;G\u00fcvenlik kontrol\u00fc yap\u0131l\u0131yor...&quot;);\r\n            return base.Get(id);\r\n        }\r\n\r\n        public override T GetAll()\r\n        {\r\n            Console.WriteLine(&quot;G\u00fcvenlik kontrol\u00fc yap\u0131l\u0131yor...&quot;);\r\n            return base.GetAll();\r\n        }\r\n    }\r\n<\/pre>\n<p>\u0130\u015f biriminden gelen ilk istek \u00fczerine &#8216;SecurityRepositoryDecorator&#8217; s\u0131n\u0131f\u0131 olu\u015fturulmu\u015ftur. Burada kontrol\u00fcn sadece select i\u015flemine odakl\u0131 istenilmesinden dolay\u0131 &#8216;Get&#8217; ve &#8216;GetAll&#8217; metotlar\u0131 override edilmi\u015f ve gerekli \u00e7al\u0131\u015fma ger\u00e7ekle\u015ftirilmi\u015ftir.<\/p>\n<blockquote><p><em style=\"font-family: 'Comic Sans MS'; font-size: 13px;\">Herhangi bir kay\u0131t eklendi\u011finde, silindi\u011finde yahut g\u00fcncellendi\u011finde i\u015flemden sonra gerekli loglar tutulsun<\/em><\/p><\/blockquote>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/ConcreteDecorator\r\n    class LoggingRepositoryDecorator&lt;T&gt; : DecoratorRepository&lt;T&gt; where T : class\r\n    {\r\n        readonly IRepository&lt;T&gt; _repository;\r\n        public LoggingRepositoryDecorator(IRepository&lt;T&gt; repository) : base(repository)\r\n        {\r\n            _repository = repository;\r\n        }\r\n        public override void Add(T model)\r\n        {\r\n            base.Add(model);\r\n            Console.WriteLine($&quot;LOG : {typeof(T).Name} eklenmi\u015ftir.&quot;);\r\n        }\r\n        public override void Delete(T model)\r\n        {\r\n            base.Delete(model);\r\n            Console.WriteLine($&quot;LOG : {typeof(T).Name} silinmi\u015ftir.&quot;);\r\n        }\r\n        public override void Update(T model)\r\n        {\r\n            base.Update(model);\r\n            Console.WriteLine($&quot;LOG : {typeof(T).Name} g\u00fcncellenmi\u015ftir.&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>\u0130kinci istekte ekleme, silme ve g\u00fcncelleme i\u015flemlerinden sonra log tutulmas\u0131 istenildi\u011fi i\u00e7in &#8216;Add&#8217;, &#8216;Delete&#8217; ve &#8216;Update&#8217; fonksiyonlar\u0131 override edilmekte ve i\u015flevsel olarak loglar ilgili operasyonlardan sonra tutulmaktad\u0131r.<\/p>\n<blockquote><p><em style=\"font-family: 'Comic Sans MS'; font-size: 13px;\">Herhangi bir kay\u0131t silindi\u011finde veya g\u00fcncellendi\u011finde CRM veritaban\u0131na API\u2019lar arac\u0131l\u0131\u011f\u0131yla ba\u011flan\u0131larak ayn\u0131 de\u011fi\u015fiklikler oraya da yans\u0131t\u0131ls\u0131n<\/em><\/p><\/blockquote>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/ConcreteDecorator\r\n    class SendCRMRepositoryDecorator&lt;T&gt; : DecoratorRepository&lt;T&gt; where T : class\r\n    {\r\n        readonly IRepository&lt;T&gt; _repository;\r\n        public SendCRMRepositoryDecorator(IRepository&lt;T&gt; repository) : base(repository)\r\n        {\r\n            _repository = repository;\r\n        }\r\n        public override void Delete(T model)\r\n        {\r\n            base.Delete(model);\r\n            Console.WriteLine(&quot;Kayd\u0131n silinmesi CRM veritaban\u0131na i\u015flendi.&quot;);\r\n        }\r\n        public override void Update(T model)\r\n        {\r\n            base.Update(model);\r\n            Console.WriteLine(&quot;Kayd\u0131n g\u00fcncellenmesi CRM veritaban\u0131na i\u015flendi.&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>\u00dc\u00e7\u00fcnc\u00fc istekte silme ve g\u00fcncelleme durumlar\u0131nda CRM veritaban\u0131 ile etkile\u015fim kurulmas\u0131 istendi\u011fi i\u00e7in &#8216;Delete&#8217; ve &#8216;Update&#8217; sorgular\u0131 override edilmekte ve i\u015flemlerden sonra gerekli operasyonlar ger\u00e7ekle\u015ftirilmektedir.<\/p>\n<blockquote><p><em style=\"font-family: 'Comic Sans MS'; font-size: 13px;\">Herhangi bir kay\u0131t g\u00fcncellendi\u011finde kim taraf\u0131ndan hangi tarihte yap\u0131ld\u0131\u011f\u0131na dair y\u00f6neticiye mail g\u00f6nderilsin<\/em><\/p><\/blockquote>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/ConcreteDecorator\r\n    class SendMailRepositoryDecorator&lt;T&gt; : DecoratorRepository&lt;T&gt; where T : class\r\n    {\r\n        readonly IRepository&lt;T&gt; _repository;\r\n        public SendMailRepositoryDecorator(IRepository&lt;T&gt; repository) : base(repository)\r\n        {\r\n            _repository = repository;\r\n        }\r\n        public override void Update(T model)\r\n        {\r\n            base.Update(model);\r\n            Console.WriteLine($&quot;{DateTime.Now} | Y\u00f6neticiye mail g\u00f6nderildi...&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>Sonuncu istekte ise sadece g\u00fcncelleme durumunda mail g\u00f6nderilmesi istenildi\u011fi i\u00e7in &#8216;Update&#8217; override edilmi\u015f ve ard\u0131ndan gerekli operasyonlar ger\u00e7ekle\u015ftirilmi\u015ftir.<\/p>\n<p>Evet&#8230; G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere geli\u015ftirdi\u011fimiz &#8216;ConcreteDecorator&#8217; s\u0131n\u0131flar\u0131 sayesinde herhangi bir de\u011fi\u015fikli\u011fi \u00e7ok rahat mimariye dahil edebilmekteyiz. B\u00f6ylece bu isteklerin d\u0131\u015f\u0131nda bamba\u015fka istekler gelirse e\u011fer mimari temellerine dokunmadan rahatl\u0131kla kar\u015f\u0131layabilmekteyiz.<\/p>\n<p>\u015eimdi gelin \u00fcretti\u011fimiz bu yap\u0131y\u0131 kullanal\u0131m;<\/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\r\n            Console.WriteLine(&quot;Repository&quot;);\r\n            Repository&lt;Employee&gt; repository = new Repository&lt;Employee&gt;();\r\n            repository.Get(3);\r\n            repository.GetAll();\r\n            repository.Add(new Employee());\r\n            repository.Delete(new Employee());\r\n            repository.Update(new Employee());\r\n\r\n            Console.WriteLine(&quot;\\nSecurityRepositoryDecorator&quot;);\r\n            Console.WriteLine(&quot;****************&quot;);\r\n            SecurityRepositoryDecorator&lt;Employee&gt; securityRepositoryDecorator = new SecurityRepositoryDecorator&lt;Employee&gt;(repository);\r\n            securityRepositoryDecorator.Get(3);\r\n            securityRepositoryDecorator.GetAll();\r\n            securityRepositoryDecorator.Add(new Employee());\r\n            securityRepositoryDecorator.Delete(new Employee());\r\n            securityRepositoryDecorator.Update(new Employee());\r\n\r\n            Console.WriteLine(&quot;\\nLoggingRepositoryDecorator&quot;);\r\n            Console.WriteLine(&quot;****************&quot;);\r\n            LoggingRepositoryDecorator&lt;Employee&gt; loggingRepositoryDecorator = new LoggingRepositoryDecorator&lt;Employee&gt;(repository);\r\n            loggingRepositoryDecorator.Get(3);\r\n            loggingRepositoryDecorator.GetAll();\r\n            loggingRepositoryDecorator.Add(new Employee());\r\n            loggingRepositoryDecorator.Delete(new Employee());\r\n            loggingRepositoryDecorator.Update(new Employee());\r\n\r\n            Console.WriteLine(&quot;\\nSendCRMRepositoryDecorator&quot;);\r\n            Console.WriteLine(&quot;****************&quot;);\r\n            SendCRMRepositoryDecorator&lt;Employee&gt; sendCRMRepositoryDecorator = new SendCRMRepositoryDecorator&lt;Employee&gt;(repository);\r\n            sendCRMRepositoryDecorator.Get(3);\r\n            sendCRMRepositoryDecorator.GetAll();\r\n            sendCRMRepositoryDecorator.Add(new Employee());\r\n            sendCRMRepositoryDecorator.Delete(new Employee());\r\n            sendCRMRepositoryDecorator.Update(new Employee());\r\n\r\n            Console.WriteLine(&quot;\\nSendMailRepositoryDecorator&quot;);\r\n            Console.WriteLine(&quot;****************&quot;);\r\n            SendMailRepositoryDecorator&lt;Employee&gt; sendMailRepositoryDecorator = new SendMailRepositoryDecorator&lt;Employee&gt;(repository);\r\n            sendMailRepositoryDecorator.Get(3);\r\n            sendMailRepositoryDecorator.GetAll();\r\n            sendMailRepositoryDecorator.Add(new Employee());\r\n            sendMailRepositoryDecorator.Delete(new Employee());\r\n            sendMailRepositoryDecorator.Update(new Employee());\r\n        }\r\n    }\r\n<\/pre>\n<p>Uygulamay\u0131 derleyip, \u00e7al\u0131\u015ft\u0131ral\u0131m&#8230;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/C-Decorator-Design-PatternDecorator-Tasarim-Deseni-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/C-Decorator-Design-PatternDecorator-Tasarim-Deseni-1.png\" alt=\"C# Decorator Design Pattern(Decorator Tasar\u0131m Deseni)\" width=\"425\" height=\"773\" class=\"aligncenter size-full wp-image-19863\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/C-Decorator-Design-PatternDecorator-Tasarim-Deseni-1.png 425w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/C-Decorator-Design-PatternDecorator-Tasarim-Deseni-1-165x300.png 165w\" sizes=\"auto, (max-width: 425px) 100vw, 425px\" \/><\/a><br \/>\nVe sonu\u00e7&#8230; G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere s\u00fcre\u00e7te gelen istekler neticesinde metotlar\u0131m\u0131z\u0131n mahiyetini mevcut mimarinin temellerine dokunmaks\u0131z\u0131n, h\u0131zl\u0131 ve esnek bir \u015fekilde geli\u015ftirmi\u015f bulunmaktay\u0131z. \u00d6nceden de ifade edildi\u011fi gibi bu desen sayesinde gelecek t\u00fcm istekler farketmeksizin bir &#8216;ConcreteDecorator&#8217; taraf\u0131ndan kar\u015f\u0131lanabilecek ve h\u0131zl\u0131ca mimariye dahil edilebilecektir.<\/p>\n<p>\u015eimdi kurguyu daha net oturtabilmek i\u00e7in bir ba\u015fka senaryo \u00fczerinden daha \u00f6rneklendirme yapal\u0131m.<\/p>\n<h4 style=\"color: purple;\">Senaryo 2<\/h4>\n<p><div id=\"attachment_19875\" style=\"width: 310px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/C-Decorator-Design-PatternDecorator-Tasarim-Deseni-2.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-19875\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/C-Decorator-Design-PatternDecorator-Tasarim-Deseni-2-300x160.png\" alt=\"C# Decorator Design Pattern(Decorator Tasar\u0131m Deseni)\" width=\"300\" height=\"160\" class=\"size-medium wp-image-19875\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/C-Decorator-Design-PatternDecorator-Tasarim-Deseni-2-300x160.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/C-Decorator-Design-PatternDecorator-Tasarim-Deseni-2.png 615w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-19875\" class=\"wp-caption-text\">\u0130kinci senaryo diyagram\u0131&#8230;<\/p><\/div>Bu senaryoda ba\u015f rol oyuncumuz sistemdeki bir daire \u00e7izici s\u0131n\u0131f olacakt\u0131r. Bu s\u0131n\u0131f, ilk etapta ald\u0131\u011f\u0131 boyut ve konum de\u011ferleri e\u015fli\u011finde daire \u00e7izme i\u015flevselli\u011fini g\u00f6stermektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Component\r\n    interface IShape\r\n    {\r\n        void Draw(Size size, int location);\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/ConcreteComponent\r\n    class Circle : IShape\r\n    {\r\n        public void Draw(Size size, int location)\r\n        {\r\n            Console.WriteLine(&quot;Daire \u00e7izildi.&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki gibi tasarlanm\u0131\u015f olan s\u0131n\u0131f \u00fczerinde a\u015fa\u011f\u0131daki yeni gereksinimlere ihtiya\u00e7 duyulmaktad\u0131r;<\/p>\n<ul>\n<li><em>Sadece dairenin kenarlar\u0131 renklendirilebilsin,<\/em><\/li>\n<li><em>Sadece daireyi i\u00e7i renklendirilebilsin,<\/em><\/li>\n<li><em>Yanlar\u0131 ve i\u00e7 k\u0131sm\u0131 ayn\u0131 anda renklendirilebilsin.<\/em><\/li>\n<\/ul>\n<p>Bu gereksinimleri normal \u015fartlarda &#8216;Circle&#8217; s\u0131n\u0131f\u0131n\u0131 g\u00fcncelleyerek kar\u015f\u0131layabiliriz. Lakin bizim buradaki amac\u0131m\u0131z decorator deseninin tatbiki oldu\u011fu i\u00e7in ilgili desen merkezli bir \u00e7\u00f6z\u00fcm sergileyece\u011fiz.<\/p>\n<p>\u0130lk olarak &#8216;Decorator&#8217; s\u0131n\u0131f\u0131n\u0131 olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Decorator\r\n    class Decorator : IShape\r\n    {\r\n        readonly IShape _shape;\r\n        public Decorator(IShape shape)\r\n        {\r\n            _shape = shape;\r\n        }\r\n        virtual public void Draw(Size size, int location)\r\n        {\r\n            _shape.Draw(size, location);\r\n        }\r\n    }\r\n<\/pre>\n<p>Ard\u0131ndan t\u00fcm yenilikleri kazand\u0131racak olan &#8216;ConcreteDecorator&#8217; s\u0131n\u0131flar\u0131n\u0131 olu\u015ftural\u0131m.<\/p>\n<blockquote><p><em style=\"font-family: 'Comic Sans MS'; font-size: 13px;\">Sadece dairenin kenarlar\u0131 renklendirilebilsin<\/em><\/p><\/blockquote>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/ConcreteDecorator\r\n    class CircleEdge : Decorator\r\n    {\r\n        readonly IShape _shape;\r\n        public CircleEdge(IShape shape) : base(shape)\r\n        {\r\n            _shape = shape;\r\n        }\r\n        private void ColorEdge()\r\n        {\r\n            Console.WriteLine(&quot;Kenarlar renklendirildi.&quot;);\r\n        }\r\n        public override void Draw(Size size, int location)\r\n        {\r\n            base.Draw(size, location);\r\n            ColorEdge();\r\n        }\r\n    }\r\n<\/pre>\n<p>\u0130lk istekte oldu\u011fu gibi &#8216;Draw&#8217; fonksiyonuna sadece kenarlar\u0131 renklendiren i\u015flevsellik kazand\u0131r\u0131lm\u0131\u015ft\u0131r.<\/p>\n<blockquote><p><em style=\"font-family: 'Comic Sans MS'; font-size: 13px;\">Sadece daireyi i\u00e7i renklendirilebilsin<\/em><\/p><\/blockquote>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/ConcreteDecorator\r\n    class CircleFill : Decorator\r\n    {\r\n        readonly IShape _shape;\r\n        public CircleFill(IShape shape) : base(shape)\r\n        {\r\n            _shape = shape;\r\n        }\r\n        private void ColorFill()\r\n        {\r\n            Console.WriteLine(&quot;Daire i\u00e7i renklendirildi.&quot;);\r\n        }\r\n        public override void Draw(Size size, int location)\r\n        {\r\n            base.Draw(size, location);\r\n            ColorFill();\r\n        }\r\n    }\r\n<\/pre>\n<p>\u0130kinci istekte oldu\u011fu gibi &#8216;Draw&#8217; fonksiyonuna sadece daire i\u00e7ini renklendiren i\u015flevsellik kazand\u0131r\u0131lm\u0131\u015ft\u0131r.<\/p>\n<blockquote><p><em style=\"font-family: 'Comic Sans MS'; font-size: 13px;\">Yanlar\u0131 ve i\u00e7 k\u0131sm\u0131 ayn\u0131 anda renklendirilebilsin<\/em><\/p><\/blockquote>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/ConcreteDecorator\r\n    class CircleFull : Decorator\r\n    {\r\n        readonly IShape _shape;\r\n        public CircleFull(IShape shape) : base(shape)\r\n        {\r\n            _shape = shape;\r\n        }\r\n        private void ColorEdge()\r\n        {\r\n            Console.WriteLine(&quot;Kenarlar renklendirildi.&quot;);\r\n        }\r\n        private void ColorFill()\r\n        {\r\n            Console.WriteLine(&quot;Daire i\u00e7i renklendirildi.&quot;);\r\n        }\r\n        public override void Draw(Size size, int location)\r\n        {\r\n            base.Draw(size, location);\r\n            ColorEdge();\r\n            ColorFill();\r\n        }\r\n    }\r\n<\/pre>\n<p>\u00dc\u00e7\u00fcnc\u00fc istekte oldu\u011fu gibi &#8216;Draw&#8217; fonksiyonuna kenar ve daire i\u00e7i olmak \u00fczere her iki renklendirme i\u015flevide ger\u00e7ekle\u015ftirilmi\u015ftir.<\/p>\n<p>Evet&#8230; Geli\u015ftirilen &#8216;ConcreteDecorator&#8217;ler sayesinde yenilikler uygulanm\u0131\u015f ve mimariye kazand\u0131r\u0131lm\u0131\u015ft\u0131r. \u015eimdi bu geli\u015ftirilen yenilikleri kullanal\u0131m;<\/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            Console.WriteLine(&quot;Circle&quot;);\r\n            Circle circle = new Circle();\r\n            circle.Draw(new Size(5, 10), 100);\r\n\r\n            Console.WriteLine(&quot;\\nCircleEdge&quot;);\r\n            Console.WriteLine(&quot;****************&quot;);\r\n            CircleEdge circleEdge = new CircleEdge(circle);\r\n            circleEdge.Draw(new Size(5, 10), 100);\r\n\r\n            Console.WriteLine(&quot;\\nCircleFill&quot;);\r\n            Console.WriteLine(&quot;****************&quot;);\r\n            CircleFill circleFill = new CircleFill(circle);\r\n            circleFill.Draw(new Size(5, 10), 100);\r\n\r\n            Console.WriteLine(&quot;\\nCircleFull&quot;);\r\n            Console.WriteLine(&quot;****************&quot;);\r\n            CircleFull circleFull = new CircleFull(circle);\r\n            circleFull.Draw(new Size(5, 10), 100);\r\n        }\r\n    }\r\n<\/pre>\n<p>Uygulamay\u0131 derleyip, \u00e7al\u0131\u015ft\u0131ral\u0131m.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/C-Decorator-Design-PatternDecorator-Tasarim-Deseni-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/C-Decorator-Design-PatternDecorator-Tasarim-Deseni-3.png\" alt=\"C# Decorator Design Pattern(Decorator Tasar\u0131m Deseni)\" width=\"221\" height=\"334\" class=\"aligncenter size-full wp-image-19878\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/C-Decorator-Design-PatternDecorator-Tasarim-Deseni-3.png 221w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/C-Decorator-Design-PatternDecorator-Tasarim-Deseni-3-199x300.png 199w\" sizes=\"auto, (max-width: 221px) 100vw, 221px\" \/><\/a><br \/>\n\u0130\u015fte sonu\u00e7&#8230; Yenilikleri sisteme uyarlayabilmek harika sizin i\u00e7inde harika olsa gerek \ud83d\ude42<\/p>\n<p>Ve son senaryo \u00fczerinden konuyu toparlayal\u0131m&#8230;<\/p>\n<h4 style=\"color: purple;\">Senaryo 3<\/h4>\n<p><div id=\"attachment_19881\" style=\"width: 310px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/C-Decorator-Design-PatternDecorator-Tasarim-Deseni-4.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-19881\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/C-Decorator-Design-PatternDecorator-Tasarim-Deseni-4-300x155.png\" alt=\"C# Decorator Design Pattern(Decorator Tasar\u0131m Deseni)\" width=\"300\" height=\"155\" class=\"size-medium wp-image-19881\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/C-Decorator-Design-PatternDecorator-Tasarim-Deseni-4-300x155.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/C-Decorator-Design-PatternDecorator-Tasarim-Deseni-4.png 633w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-19881\" class=\"wp-caption-text\">\u00dc\u00e7\u00fcnc\u00fc senaryo diyagram\u0131&#8230;<\/p><\/div>Bu senaryo <em>A\u011f Veri \u0130letim<\/em> modelleri \u00fczerine kurgulanm\u0131\u015f olacakt\u0131r. \u00d6ncelikle a\u011f veri iletim modeli hakk\u0131nda ufak bir bilgi vererek ba\u015flayal\u0131m. <div id=\"attachment_19883\" style=\"width: 191px\" class=\"wp-caption alignright\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/C-Decorator-Design-PatternDecorator-Tasarim-Deseni-5.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-19883\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/C-Decorator-Design-PatternDecorator-Tasarim-Deseni-5.png\" alt=\"\" width=\"181\" height=\"199\" class=\"size-full wp-image-19883\" \/><\/a><p id=\"caption-attachment-19883\" class=\"wp-caption-text\">A\u011f veri iletim modeli<\/p><\/div>Yandaki \u015fekilde uygulama katman\u0131(Application) olan FTP&#8217;den fiziksel katman(Physical Layer) olan ethernet driver&#8217;a ger\u00e7ekle\u015ftirilen veri ak\u0131\u015flar\u0131nda kullan\u0131lan TCP yahut UDP dosya aktar\u0131m protokolleri ele al\u0131nmaktad\u0131r.<\/p>\n<p>Normal \u015fartlarda uygulama katman\u0131, transport katman\u0131n\u0131 atlay\u0131p do\u011frudan veri aktar\u0131m\u0131 i\u00e7in a\u011f katman\u0131n\u0131(Network) kullanabilse de(bknz : <a href=\"https:\/\/www.google.com\/search?q=ICMP&#038;source=lmns&#038;bih=977&#038;biw=1858&#038;hl=tr&#038;sa=X&#038;ved=2ahUKEwiI48WwqMntAhUM8xoKHaA0BXYQ_AUoAHoECAEQAA\" rel=\"noopener noreferrer\" target=\"_blank\">ICMP<\/a>) genellikle transport katman\u0131 olarak TCP ya da UDP kullan\u0131lmaktad\u0131r. Bu durumu kod \u00fczerine yans\u0131t\u0131rsak e\u011fer;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Component\r\n    interface IDatagram\r\n    {\r\n        void Send();\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/ConcreteComponent\r\n    class AppDatagram : IDatagram\r\n    {\r\n        public void Send()\r\n        {\r\n            Console.WriteLine(&quot;IP datagram g\u00f6nder.&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere sadece Network katman\u0131n\u0131n kullan\u0131ld\u0131\u011f\u0131 bir durum oldu\u011funu varsayal\u0131m. Lakin b\u00f6yle bir durumda ihtiyaca binaen TCP yahut UDP&#8217;nin kullan\u0131lmas\u0131 s\u00f6z konusu olursa decorator desenine ba\u015fvurup, duruma \u00e7\u00f6z\u00fcm getirelim. Haliyle &#8216;Decorator&#8217; s\u0131n\u0131f\u0131n\u0131 olu\u015fturarak ba\u015flayal\u0131m;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Decorator\r\n    class TransportLayer : IDatagram\r\n    {\r\n        readonly IDatagram _datagram;\r\n        public TransportLayer(IDatagram datagram)\r\n        {\r\n            _datagram = datagram;\r\n        }\r\n        virtual public void Send()\r\n        {\r\n            _datagram.Send();\r\n        }\r\n    }\r\n<\/pre>\n<p>&#8216;Decorator&#8217; s\u0131n\u0131f\u0131ndan sonra ilk olarak TCP protokol\u00fcne uygun &#8216;ConcreteDecorator&#8217; s\u0131n\u0131f\u0131n\u0131 tasarlayal\u0131m;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/ConcreteDecorator\r\n    class UseTCP : TransportLayer\r\n    {\r\n        public UseTCP(IDatagram datagram) : base(datagram) { }\r\n        private void AddTCPHeader()\r\n        {\r\n            Console.WriteLine(&quot;TCP protokol\u00fc devreye sokuldu.&quot;);\r\n        }\r\n        public override void Send()\r\n        {\r\n            AddTCPHeader();\r\n            base.Send();\r\n        }\r\n    }\r\n<\/pre>\n<p>Ard\u0131ndan UDP protokol\u00fc i\u00e7in &#8216;ConcreteDecorator&#8217; olu\u015ftural\u0131m;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/ConcreteDecorator\r\n    class UseUDP : TransportLayer\r\n    {\r\n        public UseUDP(IDatagram datagram) : base(datagram) { }\r\n        private void AddUDPHeader()\r\n        {\r\n            Console.WriteLine(&quot;UDP protokol\u00fc devreye sokuldu.&quot;);\r\n        }\r\n        public override void Send()\r\n        {\r\n            AddUDPHeader();\r\n            base.Send();\r\n        }\r\n    }\r\n<\/pre>\n<p>Evet&#8230; \u0130lgili farklar &#8216;ConcreteDecorator&#8217; s\u0131n\u0131flar\u0131na yans\u0131t\u0131lm\u0131\u015f oldu. \u015eimdi geli\u015ftirilen yap\u0131lar\u0131 kullanma vakti;<\/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            Console.WriteLine(&quot;AppDatagram&quot;);\r\n            AppDatagram appDatagram = new AppDatagram();\r\n            appDatagram.Send();\r\n\r\n            Console.WriteLine(&quot;\\nUseTCP&quot;);\r\n            Console.WriteLine(&quot;****************&quot;);\r\n            UseTCP useTCP = new UseTCP(appDatagram);\r\n            useTCP.Send();\r\n\r\n            Console.WriteLine(&quot;\\nUseUDP&quot;);\r\n            Console.WriteLine(&quot;****************&quot;);\r\n            UseUDP useUDP = new UseUDP(appDatagram);\r\n            useUDP.Send();\r\n        }\r\n    }\r\n<\/pre>\n<p>Hemen akabinde uygulamay\u0131 derleyip, \u00e7al\u0131\u015ft\u0131ral\u0131m. Ve a\u015fa\u011f\u0131daki gibi sonucu g\u00f6zlemleyelim&#8230;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/C-Decorator-Design-PatternDecorator-Tasarim-Deseni-6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/C-Decorator-Design-PatternDecorator-Tasarim-Deseni-6.png\" alt=\"C# Decorator Design Pattern(Decorator Tasar\u0131m Deseni)\" width=\"256\" height=\"229\" class=\"aligncenter size-full wp-image-19893\" \/><\/a><\/p>\n<p><strong>Nihai olarak<\/strong><br \/>\nDecorator deseninin herhangi bir nesnenin geli\u015ftirilmi\u015f bir versiyonunu elde etmek ve metotlardaki davran\u0131\u015flar\u0131 de\u011fi\u015ftirmek i\u00e7in kullan\u0131lan strateji oldu\u011funu \u00fc\u00e7 farkl\u0131 senaryoda detayl\u0131ca g\u00f6zlemlemi\u015f bulunmaktay\u0131z. Bu ve bunun gibi ak\u0131l ve tecr\u00fcbe \u00fcr\u00fcn\u00fc desenler sayesinde, kar\u015f\u0131m\u0131za \u00e7\u0131kacak olan problemlere yakla\u015f\u0131m\u0131m\u0131z her daim daha emin ve daha net duru\u015flu olmaktad\u0131r. O y\u00fczdendir ki, son zamanlarda i\u00e7lerinde bo\u011fuldu\u011fumuz framework&#8217;ler ve programlama dilleri aras\u0131nda arada kafam\u0131z\u0131 kald\u0131r\u0131p tasar\u0131m desenleri \u00fczerine hasbihallerde bulunmak bizlere bir programc\u0131 oldu\u011fumuzu ve daha da \u00f6tesi yapt\u0131\u011f\u0131m\u0131z i\u015fin kod dilinde edebiyattan ibaret oldu\u011funu hat\u0131rlataca\u011f\u0131 kanaatindeyim&#8230;<\/p>\n<p>Okudu\u011funuz i\u00e7in te\u015fekk\u00fcr ederim&#8230;<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<p>Not : \u00d6rnek projeleri indirmek i\u00e7in <a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/DecoratorDP.zip\">buraya<\/a> t\u0131klay\u0131n\u0131z.<\/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 i\u00e7eri\u011fimizde mevcudiyette var olan bir class&#8217;a mimarisel yeni bir nitelik kazand\u0131rmam\u0131z\u0131 sa\u011flayacak olan, Structural Pattern(Yap\u0131sal Desenler)&#8217;lerden Decorator Design Pattern(Decorator Tasar\u0131m Deseni) \u00fczerine konu\u015fuyor olaca\u011f\u0131z. Yaz\u0131l\u0131m mimarilerinde temel esas, m\u00fcmk\u00fcn mertebe birbirlerinden soyutlanm\u0131\u015f&#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":19759,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[153],"tags":[3999,3998,3996,3997],"class_list":["post-19758","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-design-pattern","tag-c-decorator-design-pattern","tag-c-decorator-tasarim-deseni","tag-decorator-design-pattern","tag-decorator-tasarim-deseni"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/19758","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=19758"}],"version-history":[{"count":111,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/19758\/revisions"}],"predecessor-version":[{"id":19897,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/19758\/revisions\/19897"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/19759"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=19758"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=19758"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=19758"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}