﻿
{"id":23449,"date":"2021-11-08T01:14:32","date_gmt":"2021-11-08T01:14:32","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=23449"},"modified":"2021-11-08T01:14:32","modified_gmt":"2021-11-08T01:14:32","slug":"c-composite-design-patterncomposite-tasarim-deseni","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-composite-design-patterncomposite-tasarim-deseni\/","title":{"rendered":"C# Composite Design Pattern(Composite Tasar\u0131m Deseni)"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde Yap\u0131sal Tasar\u0131m Kal\u0131plar\u0131ndan(Structural Patterns) olan Composite Tasar\u0131m Desenini(Composite Design Pattern) tam teferruatl\u0131 inceleyecek ve bol bol \u00f6rnekler ile zihinlerimize mant\u0131ksal yap\u0131s\u0131n\u0131 kaz\u0131maya \u00e7al\u0131\u015faca\u011f\u0131z. O halde fazla vakit kaybetmeksizin buyrun ba\u015flayal\u0131m&#8230;<\/p>\n<h5 style=\"color:#e83e8c;\">Ba\u015flarken<\/h5>\n<p>Her design pattern makalesinde yapt\u0131\u011f\u0131m\u0131z gibi \u00f6ncelikle konuya dair bol teorik bilgi verdikten sonra bilgileri pratikselle\u015ftirmek i\u00e7in bir \u00f6rnek \u00fczerinden e\u015f zamanl\u0131 anlat\u0131m sergileyece\u011fiz. Ard\u0131ndan Composite pattern&#8217;\u0131n stratejik ve mant\u0131ksal yap\u0131s\u0131n\u0131 daha da \u00f6z\u00fcmseyebilmek ve kullan\u0131labilece\u011fi durumlar\u0131 h\u0131zl\u0131ca kavrayabilmek i\u00e7in be\u015f adet \u00f6rnek senaryo \u00fczerinden pratik ger\u00e7ekle\u015ftiriyor olaca\u011f\u0131z. Bu senaryolar\u0131n her biri, \u00e7\u00f6z\u00fcm\u00fc ile birlikte makalemizin alt\u0131ndaki di\u011fer sayfalarda s\u0131ras\u0131yla sunuluyor olacakt\u0131r. \u015eimdiden iyi ve verimli okumalar dilerim&#8230;<\/p>\n<h5 style=\"color:#e83e8c;\">Composite Design Pattern Nedir?<\/h5>\n<p>Bazen yaz\u0131l\u0131m tasar\u0131mlar\u0131 s\u00fcre\u00e7lerinde nesnelerin a\u011fa\u00e7 yap\u0131lar\u0131 halinde olu\u015fturulmas\u0131 ve ard\u0131ndan bu yap\u0131larla tek tek nesnelermi\u015f gibi \u00e7al\u0131\u015f\u0131lmas\u0131 gerekebilir. \u0130\u015fte b\u00f6yle durumlarda Composite pattern tasar\u0131msal a\u00e7\u0131dan imdad\u0131n\u0131za yeti\u015febilir.<\/p>\n<p>Composite pattern, kendi i\u00e7lerinde birbirlerinden farkl\u0131 olan bir grup nesnenin sanki tek bir b\u00fct\u00fcn nesneymi\u015f gibi kullan\u0131lmas\u0131n\u0131 sa\u011flamaktad\u0131r. B\u00f6ylece farkl\u0131 nesneleri bir a\u011fa\u00e7 yap\u0131s\u0131nda birle\u015ftirip genel anlamda par\u00e7a b\u00fct\u00fcn ili\u015fkisini yeniden d\u00fczenleyip \u015fekillendirmektedir.<\/p>\n<p>Composite pattern&#8217;a teoride \u015f\u00f6yle bir \u00f6rnek verebiliriz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-300x167.png\" alt=\"C# Composite Design Pattern(Composite Tasar\u0131m Deseni)\" width=\"300\" height=\"167\" class=\"alignleft size-medium wp-image-23459\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-300x167.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-768x427.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni.png 852w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>&#8216;Kutu&#8217; ve &#8216;\u00dcr\u00fcn&#8217; olmak \u00fczere iki t\u00fcrl\u00fc nesne oldu\u011funu d\u00fc\u015f\u00fcnelim. Kutu nesnesi, i\u00e7erisinde birden fazla \u00fcr\u00fcn bar\u0131nd\u0131rabilece\u011fi gibi ayriyeten kutu da bar\u0131nd\u0131rabilir. Yani bir kutu i\u00e7erisinde bir ba\u015fka kutu olabilir. Ayn\u0131 \u015fekilde kutu i\u00e7erisindeki kutu da i\u00e7erisinde \u00fcr\u00fcn bar\u0131nd\u0131rabilece\u011fi gibi yine farkl\u0131 bir kutu da bar\u0131nd\u0131rabilir. Haliyle bu silsile b\u00f6yle devam edebilir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-1-296x300.png\" alt=\"C# Composite Design Pattern(Composite Tasar\u0131m Deseni)\" width=\"296\" height=\"300\" class=\"alignright size-medium wp-image-23462\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-1-296x300.png 296w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-1.png 606w\" sizes=\"auto, (max-width: 296px) 100vw, 296px\" \/><\/a>Bu nesnelerin kullan\u0131ld\u0131\u011f\u0131 bir sipari\u015f sistemi olu\u015fturdu\u011fumuzu tahayy\u00fcl edelim ve yandaki g\u00f6r\u00fcnt\u00fcdeki gibi bir sepeti d\u00fc\u015f\u00fcnelim. Sepet i\u00e7erisinde sipari\u015fler basit \u00fcr\u00fcnlerden ibaret olabilece\u011fi gibi i\u00e7i \u00fcr\u00fcnlerle dolu kutulardan da ibaret olabilir. \u0130\u015fte b\u00f6yle bir sipari\u015f durumunda <em>siz olsan\u0131z sipari\u015fin toplam fiyat\u0131n\u0131 nas\u0131l belirlerdiniz?<\/em><\/p>\n<p>Muhtemelen \u00e7\u00f6z\u00fcm olarak t\u00fcm kutular\u0131 tek tek a\u00e7\u0131p, mevcut t\u00fcm \u00fcr\u00fcnleri g\u00f6zden ge\u00e7irdikten sonra toplam fiyat\u0131 hesaplard\u0131n\u0131z. Bu ger\u00e7ek d\u00fcnyada yap\u0131labilitesi olan yegane yoldur diyebiliriz. Ancak yaz\u0131l\u0131msal olarak bu hesaplamay\u0131 yapabilmek pekte kolay de\u011fildir. Nihayetinde i\u00e7 i\u00e7e ka\u00e7 kutu oldu\u011funu bilemedi\u011fimiz i\u00e7in recursive bir yakla\u015f\u0131m sergilememiz gerekmektedir.<\/p>\n<p>Composite pattern ise bu tarz a\u011fa\u00e7 yap\u0131s\u0131 senaryolar\u0131nda ger\u00e7ekle\u015ftirilecek b\u00fct\u00fcnsel i\u015flemleri y\u00fcr\u00fctebilmek i\u00e7in her bir composite(kutu) nesnesi \u00fczerinde operasyonu ger\u00e7ekle\u015ftirmektedir. Yukar\u0131daki teorik \u00f6rnekte oldu\u011fu gibi, toplam fiyat\u0131 hesaplayabilmek i\u00e7in her bir kutunun i\u00e7erdi\u011fi \u00fcr\u00fcnler \u00fczerinden toplam fiyat\u0131 hesaplayarak \u00f6\u011frenecek ve bunu i\u00e7 i\u00e7e olan t\u00fcm kutular i\u00e7in ger\u00e7ekle\u015ftirecektir.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-2.png\" alt=\"C# Composite Design Pattern(Composite Tasar\u0131m Deseni)\" width=\"600\" height=\"300\" class=\"aligncenter size-full wp-image-23476\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-2.png 600w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-2-300x150.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a>Bu yakla\u015f\u0131m\u0131n en b\u00fcy\u00fck yarar\u0131, a\u011fa\u00e7 yap\u0131s\u0131n\u0131 olu\u015fturan alt k\u0131r\u0131l\u0131m s\u0131n\u0131flar\u0131yla ilgilenmemize gerek olmamas\u0131d\u0131r. Yani bir nesnenin basit bir \u00fcr\u00fcn m\u00fc yoksa i\u00e7inde birden fazla \u00fcr\u00fcn ve kutu bar\u0131nd\u0131ran karma\u015f\u0131k bir kutu mu olup olmad\u0131\u011f\u0131n\u0131 bilmemize gerek yoktur. Ortak bir aray\u00fcz arac\u0131l\u0131\u011f\u0131yla her iki nesnede ayn\u0131 muameleyi g\u00f6recektir. Bu aray\u00fcz sayesinde tetiklenen metot \u00fczerinden nesneler bu tetiklenmeyi a\u011fa\u00e7tan a\u015fa\u011f\u0131 ileterek operasyonun y\u00fcr\u00fct\u00fclmesini sa\u011flayacakt\u0131r.<\/p>\n<h5 style=\"color:#e83e8c;\">Ger\u00e7ek D\u00fcnya Analojisi<\/h5>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-3.png\" alt=\"C# Composite Design Pattern(Composite Tasar\u0131m Deseni)\" width=\"280\" height=\"230\" class=\"alignleft size-full wp-image-23489\" \/><\/a>Biliyorsunuz ki, \u00e7o\u011fu \u00fclkenin ordular\u0131 hiyerar\u015fik olarak yap\u0131land\u0131r\u0131lm\u0131\u015ft\u0131r. Bir ordu birbirleriyle ili\u015fkili birka\u00e7 b\u00f6l\u00fcmden meydana gelmektedir. Misal olarak, bir t\u00fcmen tugaylardan olu\u015furken, bir tugay alaylardan olu\u015fmakta, alaylar ise mangalara kadar ayr\u0131lan m\u00fcfrezelerden meydana gelmektedir. Haliyle bu \u015fekilde ili\u015fkilendirilmi\u015f bir yap\u0131lanmada hiyerar\u015finin en \u00fcst\u00fcnden verilen emirler, her seviyedeki t\u00fcm askerlere ula\u015ft\u0131r\u0131lacak \u015fekilde aktar\u0131lmaktad\u0131r. \u0130\u015fte bu hiyerar\u015finin d\u00fczenlenmesinde Composite pattern rahatl\u0131kla kullan\u0131labilir.<\/p>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni.jpg\" alt=\"C# Composite Design Pattern(Composite Tasar\u0131m Deseni)\" width=\"389\" height=\"250\" class=\"alignright size-full wp-image-23491\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni.jpg 389w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-300x193.jpg 300w\" sizes=\"auto, (max-width: 389px) 100vw, 389px\" \/><\/a>Benzer mant\u0131kla \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131z \u015firkette veya kurumda ekibin organizasyonel yap\u0131s\u0131n\u0131 ve personellerin pozisyonlar\u0131n\u0131 i\u015flevsel ili\u015fkiler \u00fczerinden hiyerar\u015fik olarak g\u00f6steren te\u015fkilat \u015femalar\u0131 mevcuttur. Bu te\u015fkilat \u015femalar\u0131 da t\u0131pk\u0131 ordularda oldu\u011fu gibi hiyerar\u015finin en \u00fcst\u00fcnden alt\u0131na do\u011fru sorumluluk a\u011flar\u0131n\u0131 g\u00f6stermektedir. \u0130\u015flevsel a\u00e7\u0131dan sorumluluklar, en \u00fcstten a\u015fa\u011f\u0131 do\u011fru her seviyedeki personellere ayr\u0131\u015ft\u0131r\u0131lacak \u015fekilde tasarlanmaktad\u0131r. Buradaki mant\u0131kta yaz\u0131l\u0131msal d\u00fczleme Composite pattern ile rahatl\u0131kla aktar\u0131labilir.<\/p>\n<h5 style=\"color:#e83e8c;\">Composite Design Pattern&#8217;\u0131n Stratejisi<\/h5>\n<p>Composite pattern&#8217;\u0131n uygulanaca\u011f\u0131 a\u011fa\u00e7 yap\u0131lar\u0131 misali tasar\u0131mlarda <em>Component<\/em>, <em>Composite<\/em> ve <em>Leaf<\/em> isimlerinde olmak \u00fczere \u00fc\u00e7 farkl\u0131 sorumlulukta s\u0131n\u0131f tasarlanmas\u0131 gerekmektedir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-1.jpg\" alt=\"C# Composite Design Pattern(Composite Tasar\u0131m Deseni)\" width=\"470\" height=\"293\" class=\"aligncenter size-full wp-image-23497\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-1.jpg 470w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-1-300x187.jpg 300w\" sizes=\"auto, (max-width: 470px) 100vw, 470px\" \/><\/a>Bu s\u0131n\u0131flar\u0131n ne oldu\u011funu ve hangi sorumluluklar\u0131 \u00fcstlendi\u011fini a\u00e7\u0131klamam\u0131z gerekirse e\u011fer;<\/p>\n<ul>\n<li><strong>Component<\/strong><br \/>\nA\u011fa\u00e7 yap\u0131s\u0131ndaki basit ve karma\u015f\u0131k nesneleri ve bu nesnelerin ortak alanlar\u0131n\u0131 a\u00e7\u0131klayan abstract s\u0131n\u0131ft\u0131r.\n<\/li>\n<li><strong>Composite<\/strong><em><br \/>\nA\u011fa\u00e7 yap\u0131s\u0131ndaki karma\u015f\u0131k nesnelere kar\u015f\u0131l\u0131k gelen s\u0131n\u0131ft\u0131r. Daha teknik bir izahatte bulunmam\u0131z gerekirse e\u011fer Component<\/em>&#8216;lerin bir araya geldi\u011fi ve a\u011fa\u00e7 yap\u0131s\u0131ndaki alt k\u0131r\u0131l\u0131mlar\u0131 olu\u015fturan kompleks nesneleri temsil etmektedir.\n<\/li>\n<li><strong>Leaf<\/strong><br \/>\nA\u011fa\u00e7 yap\u0131s\u0131ndaki en temel unsuru olan ve alt k\u0131r\u0131l\u0131m bar\u0131nd\u0131rmayan tek bir <em>Component<\/em> nesnesidir. Yani basit nesneyi ifade eder.\n<\/li>\n<\/ul>\n<div id=\"attachment_23504\" style=\"width: 471px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-4.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-23504\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-4.png\" alt=\"C# Composite Design Pattern(Composite Tasar\u0131m Deseni)\" width=\"461\" height=\"371\" class=\"size-full wp-image-23504\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-4.png 461w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-4-300x241.png 300w\" sizes=\"auto, (max-width: 461px) 100vw, 461px\" \/><\/a><p id=\"caption-attachment-23504\" class=\"wp-caption-text\"><span style=\"font-size:12px;\">Composite Object ile Leaf Object aras\u0131ndaki ili\u015fkiyi g\u00fczel bir \u015fekilde temsil eden g\u00f6rsel \u015fema&#8230;<\/span><\/p><\/div>\n<div id=\"attachment_23506\" style=\"width: 461px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-5.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-23506\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-5.png\" alt=\"C# Composite Design Pattern(Composite Tasar\u0131m Deseni)\" width=\"451\" height=\"401\" class=\"size-full wp-image-23506\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-5.png 451w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-5-300x267.png 300w\" sizes=\"auto, (max-width: 451px) 100vw, 451px\" \/><\/a><p id=\"caption-attachment-23506\" class=\"wp-caption-text\"><span style=\"font-size:12px;\">Composite Pattern stratejisinin kat\u0131l\u0131mc\u0131lar\u0131 yukar\u0131da g\u00f6r\u00fcld\u00fc\u011f\u00fc gibidir&#8230; Burada dikkat edilmesi gereken nokta; basit \u00f6\u011feler <em style=\"color:red;\">Leaf<\/em>, karma\u015f\u0131k \u00f6\u011feler ise <em style=\"color:red;\">Composite<\/em> olarak nitelendirilmektedir&#8230;<\/span><\/p><\/div>\n<blockquote><p><em style=\"color:purple;\">Composite pattern&#8217;da birden \u00e7o\u011fa hiyerar\u015fik yap\u0131lanma s\u00f6z konusudur.<\/em><\/p><\/blockquote>\n<h5 style=\"color:#e83e8c;\">Teknik Olarak Composite Design Pattern<\/h5>\n<p>Composite pattern&#8217;\u0131 teknik olarak inceleyebilmek i\u00e7in yukar\u0131daki sat\u0131rlarda de\u011findi\u011fimiz ger\u00e7ek d\u00fcnya analojisindeki asker senaryosundan yola \u00e7\u0131kal\u0131m ve pratiksel a\u00e7\u0131dan ilgili senaryonun \u00f6rne\u011fini ger\u00e7ekle\u015ftirerek seyredelim.<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"color:red;\">SENARYO<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"color:#EEF2F5;background-color:gray;font-size:13px;\">Emir komuta sistemine sahip ordu modelini yaz\u0131l\u0131msal olarak in\u015fa edelim ve \u00fcst r\u00fctbelerden gelen emirleri t\u00fcm seviyelerdeki askerlere iletelim.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<table>\n<thead>\n<tr>\n<th style=\"color:red;\">\u00c7\u00d6Z\u00dcM<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size:13px;text-align:left;\">\n<ul>\n<li><em><strong>Ad\u0131m 1<\/strong> <span style=\"color:green;\">(Component Soyut S\u0131n\u0131f\u0131n\u0131n Tasarlanmas\u0131)<\/span><\/em><br \/>\nHer \u015feyden \u00f6nce a\u011fa\u00e7 yap\u0131lanmas\u0131nda <em>Leaf<\/em> ve <em>Composite<\/em> nesnelerimizin temelini te\u015fkil edecek olan <em>Component<\/em> soyut s\u0131n\u0131f\u0131n\u0131 tasarlayarak ba\u015flayal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Component\r\n    public abstract class Soldier\r\n    {\r\n        protected string _name;\r\n        protected Rank _rank;\r\n\r\n        protected Soldier(string name, Rank rank)\r\n        {\r\n            _name = name;\r\n            _rank = rank;\r\n        }\r\n\r\n        public abstract void AddSoldier(Soldier soldier);\r\n        public abstract void RemoveSoldier(Soldier soldier);\r\n        public abstract void ExecuteOrder();\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funda bir asker&#8217;i ifade eden <em>Component<\/em> soyut s\u0131n\u0131f tasar\u0131m\u0131 ger\u00e7ekle\u015ftirilmi\u015ftir. Dikkat ederseniz askere dair isim(_name) ve r\u00fctbe(_rank) bilgileri constructor \u00fczerinden edinilmi\u015f ve sadece <em>Composite<\/em> nesnelerde kullan\u0131lmak \u00fczere &#8216;AddSoldier&#8217; ve &#8216;RemoveSoldier&#8217; abstract fonksiyonlar\u0131yla birlikte hem <em>Composite<\/em> hem de <em>Leaf<\/em> nesnelerde kullan\u0131lacak &#8216;ExecuteOrder&#8217; abstract metodu tan\u0131mlanm\u0131\u015ft\u0131r.<\/p>\n<p>Esas\u0131nda, <em>Composite<\/em> nesneler i\u00e7in tan\u0131mlanm\u0131\u015f olan fonksiyonlar <em>Leaf<\/em> nesnelere de override edilecek olsa dahi ilgili nesneler i\u00e7in anlaml\u0131 fonksiyonlar olmayacak, bo\u015f olarak kalacakt\u0131rlar. Haliyle yaz\u0131m\u0131z\u0131n ileriki sat\u0131rlar\u0131nda bu durumun <a href=\"https:\/\/www.gencayyildiz.com\/blog\/arayuz-ayrim-prensibiinterface-segregation-principle-isp\/\" rel=\"noopener\" target=\"_blank\">Interface Segregation Principle<\/a>&#8216;a ayk\u0131r\u0131l\u0131k olu\u015fturabilece\u011fini g\u00f6recek ve nas\u0131l \u00f6nlemler alabilece\u011fimizin isti\u015faresini ediyor olaca\u011f\u0131z. Ayr\u0131ca sonraki sayfalarda sunaca\u011f\u0131m\u0131z be\u015f adet \u00f6rnek senaryo \u00fczerinden de bu riski ortadan kald\u0131racak olan yakla\u015f\u0131m\u0131 s\u00fcrekli tatbik ederek, tecr\u00fcbe etmi\u015f olaca\u011f\u0131z.<\/p>\n<p>Bu arada yukar\u0131daki kodda bulunan r\u00fctbe(Rank) i\u00e7eri\u011fi a\u015fa\u011f\u0131daki gibi olacakt\u0131r;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Soldier Rank\r\n    public enum Rank\r\n    {\r\n        General, \/\/General\r\n        Colonel, \/\/Albay\r\n        LieutenantColonel, \/\/Yarbay\r\n        Major, \/\/Binba\u015f\u0131\r\n        Captain, \/\/Y\u00fczba\u015f\u0131\r\n        Lieutenant \/\/Te\u011fmen\r\n    }\r\n<\/pre>\n<\/li>\n<li><em><strong>Ad\u0131m 2<\/strong> <span style=\"color:green;\">(Composite S\u0131n\u0131f\u0131n\u0131n Tasarlanmas\u0131)<\/span><\/em><br \/>\nS\u0131ra ordu hiyerar\u015fisinde alt k\u0131r\u0131l\u0131m noktalar\u0131na kar\u015f\u0131l\u0131k gelecek olan askerleri(komutan) olu\u015fturmaya gelmi\u015ftir. Bu askerler emrinde bir veya birden fazla komutan veya asker bar\u0131nd\u0131ran g\u00f6revliler olabilir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Composite\r\n    public class Commander : Soldier\r\n    {\r\n        List&lt;Soldier&gt; _soldiers = new();\r\n        public Commander(string name, Rank rank) : base(name, rank)\r\n        {\r\n        }\r\n\r\n        public override void AddSoldier(Soldier soldier)\r\n            =&gt; _soldiers.Add(soldier);\r\n\r\n        public override void RemoveSoldier(Soldier soldier)\r\n            =&gt; _soldiers.Remove(soldier);\r\n\r\n        public override void ExecuteOrder()\r\n        {\r\n            Console.WriteLine($&quot;{_rank} - {_name}&quot;);\r\n            foreach (Soldier soldier in _soldiers)\r\n                soldier.ExecuteOrder();\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer &#8216;Commander&#8217; s\u0131n\u0131f\u0131, emrinde birden fazla komutan ve asker bar\u0131nd\u0131ran(komutan seviyesinde) bir asker oldu\u011fu i\u00e7in &#8216;Soldier&#8217; abstract class&#8217;\u0131ndan t\u00fcremektedir. Haliyle bu s\u0131n\u0131f ilgili komutan\u0131n maiyetini temsil edecek olan 4. sat\u0131rda tan\u0131mlanm\u0131\u015f bir koleksiyon bar\u0131nd\u0131rmaktad\u0131r. Bu koleksiyon, ilgili askerin alt\u0131ndaki di\u011fer askerleri temsil etmektedir. Dolay\u0131s\u0131yla ilgili askerin maiyetine &#8216;AddSoldier&#8217; ve &#8216;RemoveSoldier&#8217; fonksiyonlar\u0131 e\u015fli\u011finde askerler eklenmekte yahut varsa \u00e7\u0131kar\u0131lmaktad\u0131r. Ayr\u0131ca &#8216;ExecuteOrder&#8217; metoduna dikkat ederseniz e\u011fer bu metot ile \u00fcstlerden gelen emirler do\u011frultusunda gerekli operasyonlar ger\u00e7ekle\u015ftirilmekte ve i\u00e7erisinde maiyeti \u00fczerinde tek tek d\u00f6ng\u00fc ile i\u015flemler ger\u00e7ekle\u015ftirilerek hiyerar\u015fik bir \u015fekilde emri alt\u0131ndaki askerlere gelen emirler iletilmektedir.<\/p>\n<\/li>\n<li><em><strong>Ad\u0131m 3<\/strong> <span style=\"color:green;\">(Leaf S\u0131n\u0131f\u0131n\u0131n Tasarlanmas\u0131)<\/span><\/em><br \/>\nOrdu hiyerar\u015fisinde, a\u011fa\u00e7 yap\u0131s\u0131n\u0131n son halkas\u0131 er olan askerlerdir. Haliyle bunlar tasar\u0131m\u0131m\u0131zda <em>Leaf<\/em> olarak nitelendirilmektedirler.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Leaf\r\n    public class BuckPrivate : Soldier\r\n    {\r\n        public BuckPrivate(string name, Rank rank) : base(name, rank)\r\n        {\r\n        }\r\n\r\n        \/\/Bu fonksiyonun er olan askerler(Leaf) i\u00e7in bir anlam\u0131 yoktur!\r\n        public override void AddSoldier(Soldier soldier)\r\n            =&gt; throw new NotImplementedException();\r\n\r\n        \/\/Bu fonksiyonun er olan askerler(Leaf) i\u00e7in bir anlam\u0131 yoktur!\r\n        public override void RemoveSoldier(Soldier soldier)\r\n            =&gt; throw new NotImplementedException();\r\n\r\n        public override void ExecuteOrder()\r\n            =&gt; Console.WriteLine($&quot;{_rank} - {_name}&quot;);\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funa g\u00f6z atarsan\u0131z e\u011fer &#8216;BuckPrivate&#8217; s\u0131n\u0131f\u0131 bir eri temsil ediyor olsa da \u00f6z\u00fcnde bir asker oldu\u011fu i\u00e7in yine &#8216;Soldier&#8217; soyut s\u0131n\u0131f\u0131ndan t\u00fcremekte ve i\u00e7erisinde gerekli implemantasyonlar\u0131 sa\u011flamaktad\u0131r. Burada ilk dikkat edilmesini istedi\u011fim nokta &#8216;BuckPrivate&#8217;\u0131n kendisinden sonra hiyerar\u015fik a\u00e7\u0131dan ba\u015fka bir askerin gelmedi\u011fi, yani zincirin son halkas\u0131 oldu\u011fudur. Haliyle bu nesne bir \u00f6nceki &#8216;Commander&#8217; s\u0131n\u0131f\u0131nda oldu\u011fu gibi bir koleksiyon vs. bar\u0131nd\u0131rmamaktad\u0131r. Bu sebepten dolay\u0131 komutanlardan gelen emirleri i\u015fleyen &#8216;ExecuteOrder&#8217; metodu direkt o anki askere odakl\u0131 bir \u015fekilde in\u015fa edilmektedir.<\/p>\n<p>Bunlar\u0131n d\u0131\u015f\u0131nda &#8216;AddSoldier&#8217; ve &#8216;RemoveSoldier&#8217; fonksiyonlar\u0131 g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere er olan askerler i\u00e7in bir anlam ifade etmemektedir. Haliyle 1. ad\u0131mda hafiften at\u0131fta bulundu\u011fumuz nokta buras\u0131d\u0131r. Bu fonksiyonlar\u0131n, <em>Leaf<\/em> s\u0131n\u0131f\u0131nda i\u015flevi olmad\u0131\u011f\u0131 halde tan\u0131mlanmalar\u0131 tasar\u0131msal bir hatadan ziyade \u00f6nceden de bahsedildi\u011fi \u00fczere <a href=\"https:\/\/www.gencayyildiz.com\/blog\/arayuz-ayrim-prensibiinterface-segregation-principle-isp\/\" rel=\"noopener\" target=\"_blank\">Aray\u00fcz Ayr\u0131m Prensibi<\/a>&#8216;ne ayk\u0131r\u0131d\u0131r.<\/p>\n<p><strong><em>Peki bu duruma nas\u0131l \u00f6nlem alabiliriz?<\/em><\/strong><br \/>\nBu duruma \u00f6nlem alabilmenin yolu 1. ad\u0131mda ki <em>Component<\/em> tasar\u0131m\u0131n\u0131n aray\u00fcz ayr\u0131m prensibine uygun bir \u015fekilde tasarlanmas\u0131ndan ge\u00e7mektedir.<\/p>\n<p>\u015e\u00f6yle ki;<\/p>\n<p>Bir asker iki t\u00fcrl\u00fc olabilir. Ya emrinde farkl\u0131 asker ve komutanlar bar\u0131nd\u0131ran bir asker ya da er! Dolay\u0131s\u0131yla,<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Component\r\n    public abstract class Soldier\r\n    {\r\n        protected string _name;\r\n        protected Rank _rank;\r\n\r\n        protected Soldier(string name, Rank rank)\r\n        {\r\n            _name = name;\r\n            _rank = rank;\r\n        }\r\n        public abstract void ExecuteOrder();\r\n    }\r\n<\/pre>\n<p>&#8216;Soldier&#8217; s\u0131n\u0131f\u0131 t\u00fcm askerlere genellenebilir \u015fekilde yukar\u0131daki gibi tasarlan\u0131rken,<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Component\r\n    public abstract class SoldierComposite : Soldier\r\n    {\r\n        protected SoldierComposite(string name, Rank rank) : base(name, rank)\r\n        {\r\n        }\r\n\r\n        public abstract void AddSoldier(Soldier soldier);\r\n        public abstract void RemoveSoldier(Soldier soldier);\r\n    }\r\n<\/pre>\n<p>emrinde farkl\u0131 asker ve komutanlar bar\u0131nd\u0131ran askerleri yukar\u0131daki gibi &#8216;SoldierComposite&#8217; misali farkl\u0131 bir s\u0131n\u0131fta tasarlamak yeterli olacakt\u0131r. Nihayetinde bu iki s\u0131n\u0131fta tasar\u0131msal a\u00e7\u0131dan <em>Component<\/em>&#8216;e kar\u015f\u0131l\u0131k gelecektir. &#8216;SoldierComposite&#8217;e g\u00f6z atarsan\u0131z e\u011fer Leaf i\u00e7in bir anlam ifade etmeyen t\u00fcm fonksiyonlar bu s\u0131n\u0131f alt\u0131nda tan\u0131mlanm\u0131\u015ft\u0131r.<\/p>\n<p>Tabi s\u00fcre\u00e7te Composite ve Leaf s\u0131n\u0131flar\u0131n\u0131n da a\u015fa\u011f\u0131daki gibi tasarlanmas\u0131 gerecektir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Composite\r\n    public class Commander : SoldierComposite\r\n    {\r\n        List&lt;Soldier&gt; _soldiers = new();\r\n        public Commander(string name, Rank rank) : base(name, rank)\r\n        {\r\n        }\r\n\r\n        public override void AddSoldier(Soldier soldier)\r\n            =&gt; _soldiers.Add(soldier);\r\n\r\n        public override void RemoveSoldier(Soldier soldier)\r\n            =&gt; _soldiers.Remove(soldier);\r\n\r\n        public override void ExecuteOrder()\r\n        {\r\n            Console.WriteLine($&quot;{_rank} - {_name}&quot;);\r\n            foreach (Soldier soldier in _soldiers)\r\n                soldier.ExecuteOrder();\r\n        }\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Leaf\r\n    public class BuckPrivate : Soldier\r\n    {\r\n        public BuckPrivate(string name, Rank rank) : base(name, rank)\r\n        {\r\n        }\r\n\r\n        public override void ExecuteOrder()\r\n            =&gt; Console.WriteLine($&quot;{_rank} - {_name}&quot;);\r\n    }\r\n<\/pre>\n<p>Haliyle art\u0131k <em>Leaf<\/em> i\u00e7in anlam\u0131 olmayan fonksiyonlar l\u00fczumsuz yere tan\u0131mlanm\u0131\u015f olmayacakt\u0131r. Bundan sonra ilgili pattern&#8217;\u0131n tatbik edilmesi amac\u0131yla yaz\u0131m\u0131z\u0131n devam sayfalar\u0131nda verece\u011fimiz \u00f6rneklerde direkt bu \u015fekilde bir tasar\u0131m baz al\u0131n\u0131p geli\u015ftirme yap\u0131lacakt\u0131r.\n<\/li>\n<li><em><strong>Ad\u0131m 4<\/strong> <span style=\"color:green;\">(Test)<\/span><\/em><br \/>\nYukar\u0131daki ad\u0131mlar\u0131 tam teferruatl\u0131 bir \u015fekilde ger\u00e7ekle\u015ftirdiysek e\u011fer art\u0131k Composite pattern in\u015fas\u0131 tamamlanm\u0131\u015ft\u0131r demektir. \u015eimdi test edebiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            \/\/Composite general nesnes olu\u015fturuyoruz.\r\n            Commander general = new Commander(&quot;Gen\u00e7ay&quot;, Rank.General);\r\n\r\n            \/\/Composite general nesnesine Leaf nesneler ekliyoruz.\r\n            general.AddSoldier(new BuckPrivate(&quot;M\u00fcsl\u00fcm&quot;, Rank.Colonel));\r\n            general.AddSoldier(new BuckPrivate(&quot;Orhan&quot;, Rank.Colonel));\r\n\r\n            \/\/Yeni Composite albay ve yarbay nesneleri olu\u015fturuyoruz.\r\n            Commander albay = new Commander(&quot;Hilmi&quot;, Rank.Major);\r\n            Commander yarbay = new Commander(&quot;Cavit&quot;, Rank.LieutenantColonel);\r\n\r\n            \/\/Yarbay Composite nesnesine Leaf nesneler ekliyoruz.\r\n            yarbay.AddSoldier(new BuckPrivate(&quot;Murat&quot;, Rank.Major));\r\n            yarbay.AddSoldier(new BuckPrivate(&quot;Kaan&quot;, Rank.Major));\r\n\r\n            \/\/Albay Composite nesnesine yarbay nesnesini ekliyoruz.\r\n            albay.AddSoldier(yarbay);\r\n\r\n            \/\/Albay Composite nesnesine Leaf nesne ekliyoruz.\r\n            albay.AddSoldier(new BuckPrivate(&quot;Mustafa&quot;, Rank.LieutenantColonel));\r\n\r\n            \/\/Albay Composite nesnesini general nesnesine ekliyoruz.\r\n            general.AddSoldier(albay);\r\n\r\n            \/\/General nesnesinden emri veriyoruz!\r\n            general.ExecuteOrder();\r\n        }\r\n<\/pre>\n<p>Yukar\u0131daki kodu derleyip, \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcyle kar\u015f\u0131la\u015fmaktay\u0131z.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-2.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/10\/C-Composite-Design-PatternComposite-Tasarim-Deseni-2.jpg\" alt=\"C# Composite Design Pattern(Composite Tasar\u0131m Deseni)\" width=\"226\" height=\"135\" class=\"aligncenter size-full wp-image-23541\" \/><\/a>\u0130\u015fte bu kadar&#8230; \ud83d\ude42<br \/>\nG\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere hiyerar\u015fideki t\u00fcm nesneler tek tek tetiklenerek ordu yap\u0131lanmas\u0131nda en ba\u015fta verilen emir en alttaki askere kadar i\u015fletilerek, eri\u015ftirilmi\u015ftir.\n<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<blockquote><p><em style=\"color:green;\">Client a\u00e7\u0131s\u0131ndan tekil nesneler ile nesne gruplar\u0131 aras\u0131ndaki farkl\u0131l\u0131klar\u0131 g\u00f6rmeksizin i\u015flem yapmak i\u00e7in Composite pattern kullan\u0131labilir.<\/em><\/p><\/blockquote>\n<h5 style=\"color:#e83e8c;\">Uygulanabilirlik<\/h5>\n<p>Yukar\u0131da g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere Composite pattern, <em>Leaf<\/em> ve <em>Composite<\/em> yap\u0131lar\u0131ndan olu\u015fan ve bu yap\u0131lar aras\u0131nda stratejik bir ayr\u0131m sa\u011flayan tasar\u0131m desenidir. \u0130htiya\u00e7 olarak a\u011fa\u00e7 yap\u0131s\u0131(bir ba\u015fka deyi\u015fle hiyerar\u015fik) operasyonlar\u0131nda \u00f6zyinelemeli(recursive) nesne yap\u0131s\u0131 olu\u015fturulmas\u0131na olanak sa\u011flamaktad\u0131r. Bu recursive operasyon esnas\u0131nda client, hem <em>Leaf<\/em> hem de <em>Composite<\/em> yap\u0131lar\u0131 ekstra \u00e7abalara giri\u015fmeksizin ayn\u0131 \u015fekilde(fark yaratmaks\u0131z\u0131n) i\u015flemektedir.<\/p>\n<h5 style=\"color:#e83e8c;\">Lehte ve Aleyhte Durumlar<\/h5>\n<table style=\"font-size:13px;\">\n<thead>\n<tr>\n<th>\u2713<\/th>\n<th>\uab55<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Karma\u015f\u0131k a\u011fa\u00e7 yap\u0131lar\u0131yla rahatl\u0131kla \u00e7al\u0131\u015f\u0131labilir.\n<\/td>\n<td>\n\u0130\u015flevselli\u011fi \u00e7ok farkl\u0131 olan s\u0131n\u0131flar i\u00e7in ortak bir aray\u00fcz sa\u011flamak zor olabilir. Belirli senaryolarda <em>Component<\/em> aray\u00fcz\u00fcn\u00fc a\u015f\u0131r\u0131 genelle\u015ftirmek gerekebilir. Haliyle bu durumda ilgili tasar\u0131m\u0131n anla\u015f\u0131lmas\u0131n\u0131 zorla\u015ft\u0131rabilir.\n<\/td>\n<\/tr>\n<tr>\n<td>Nesne a\u011fac\u0131yla \u00e7al\u0131\u015fan nesneleri mevcut kodu bozmadan uygulamaya ekleyebildi\u011fimizden dolay\u0131 <a href=\"https:\/\/www.gencayyildiz.com\/blog\/acik-kapali-prensibiopen-closed-principle-ocp\/\" rel=\"noopener\" target=\"_blank\">Open Closed<\/a> prensibiyle uyumludur.\n<\/td>\n<td>Composite pattern, yukar\u0131daki senaryonun 3. ad\u0131m\u0131nda bahsedildi\u011fi \u00fczere <a href=\"https:\/\/www.gencayyildiz.com\/blog\/arayuz-ayrim-prensibiinterface-segregation-principle-isp\/\" rel=\"noopener\" target=\"_blank\">Interface Segregation<\/a> prensibine ayk\u0131r\u0131 olabilir.\n<\/td>\n<\/tr>\n<tr>\n<td>Daha az bellek y\u00f6netimi gerektirmektedir.\n<\/td>\n<td>\n<\/td>\n<\/tr>\n<tr>\n<td>Esnektir.\n<\/td>\n<td>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<blockquote><p><em style=\"color:gray;\">\u0130lkel(Leaf) ve karma\u015f\u0131k(Composite) nesnelerin i\u015flenmesi farkl\u0131 \u015fekilde ele al\u0131n\u0131r. Haliyle her nesneyi i\u015flemeden \u00f6nce t\u00fcr\u00fcn\u00fc sorgulama zahmetine katlanmaks\u0131z\u0131n Composite pattern ile h\u0131zl\u0131 \u00e7\u00f6z\u00fcm getirebilirsiniz.<\/em><\/p><\/blockquote>\n<h5 style=\"color:#e83e8c;\">Di\u011fer Kal\u0131plarla \u0130li\u015fkisi<\/h5>\n<ul>\n<li>Karma\u015f\u0131k <em>Composite<\/em> a\u011fa\u00e7lar olu\u015ftururken <a href=\"https:\/\/www.gencayyildiz.com\/blog\/c-builder-design-patternbuilder-tasarim-deseni\/\" rel=\"noopener\" target=\"_blank\">Builder Design Pattern<\/a> kullan\u0131labilir.<\/li>\n<li>Chain of Responsibility, genellikle Composite pattern ile birlikte kullan\u0131l\u0131r. Bu durumda bir yaprak(<em>Leaf<\/em>) herhangi bir istek ald\u0131\u011f\u0131nda o iste\u011fi t\u00fcm ana bile\u015fenlerin zincirinden ge\u00e7irerek nesne a\u011fac\u0131n\u0131n k\u00f6k\u00fcne kadar iletebilir.<\/li>\n<li>Composite a\u011fac\u0131n\u0131 t\u00fcm alt k\u0131r\u0131l\u0131mlar\u0131yla birlikte tetikleyebilmek i\u00e7in <a href=\"https:\/\/www.gencayyildiz.com\/blog\/c-iterator-design-patterniterator-tasarim-deseni\/\" rel=\"noopener\" target=\"_blank\">Iterator Design Pattern<\/a> kullan\u0131labilir.<\/li>\n<li>Composite a\u011fac\u0131n\u0131n tamam\u0131n\u0131n \u00fczerinde b\u00fct\u00fcnsel i\u015flem yapabilmek i\u00e7in <a href=\"https:\/\/www.gencayyildiz.com\/blog\/c-visitor-design-patternvisitor-tasarim-deseni\/\" rel=\"noopener\" target=\"_blank\">Visitor Design Pattern<\/a> kullan\u0131labilir. Bununla ilgili, Visitor pattern i\u00e7in referans edilen ilgili makalemde <strong>Kritik<\/strong> ba\u015fl\u0131\u011f\u0131 alt\u0131ndaki yorumu okuyabilir ve \u00f6rne\u011fi inceleyebilirsiniz.<\/li>\n<li>Yo\u011fun Composite pattern&#8217;\u0131 kullanan tasar\u0131mlarda <a href=\"https:\/\/www.gencayyildiz.com\/blog\/c-prototype-design-pattern-prototip-tasarim-deseni\/\" rel=\"noopener\" target=\"_blank\">Prototype Design Pattern<\/a> kullan\u0131larak karma\u015f\u0131k yap\u0131lar\u0131 s\u0131f\u0131rdan olu\u015fturma maliyeti ortadan kald\u0131r\u0131labilir.<\/li>\n<\/ul>\n<h5 style=\"color:#e83e8c;\">Genel G\u00f6r\u00fc\u015fler<\/h5>\n<p>Composite pattern&#8217;\u0131n t\u00fcm amac\u0131 birbirleriyle ili\u015fkili karma\u015f\u0131k(composite) yap\u0131lar\u0131n t\u0131pk\u0131 bir yaprak gibi atomik olarak i\u015flenebilmesidir. Nihayetinde bu kal\u0131b\u0131n merkezinde, bir client&#8217;\u0131n i\u00e7inde bir \u00e7ok nesne oldu\u011funu bilmesine gerek kalmaks\u0131z\u0131n ilkel ve karma\u015f\u0131k nesneler(a\u011fa\u00e7 yap\u0131s\u0131) \u00fczerinde i\u015flem yapabilme yete\u011fi yatmaktad\u0131r.<\/p>\n<p>Composite pattern ile heterojen olan ilkel(<em>Leaf<\/em>) ve karma\u015f\u0131k(<em>Composite<\/em>) nesne koleksiyonunu atomik olarak ele alabilmek i\u00e7in gerekli fonksiyonlar\u0131n <em>Component<\/em> aray\u00fcz\u00fcnde tan\u0131mlanmas\u0131 yeterlidir. Ancak bu tan\u0131mlama, \u00f6nceki sat\u0131rlarda da de\u011findi\u011fimiz gibi(\u00f6zellikle pratik \u00f6rne\u011fin 3. ad\u0131m\u0131nda) <em>Leaf<\/em> nesnelerinde de implemantasyona neden olaca\u011f\u0131ndan dolay\u0131 olas\u0131 g\u00fcvensizli\u011fe m\u00e2l olabilir. \u00c7\u00fcnk\u00fc client&#8217;lar <em>Leaf<\/em> nesneler \u00fczerinden <em>Composite<\/em> nesnelere \u00f6zel olan fonksiyonlar\u0131 kullanmak gibi anlams\u0131z eylemler yapabilir. Halbuki <em>Component<\/em>&#8216;te tan\u0131ml\u0131 olan composite fonksiyonlar\u0131 <em>Leaf<\/em> nesneleri i\u00e7in bir anlam ifade etmeyecektir. Haliyle bu durum daha \u00f6nceden de bahsedildi\u011fi gibi <a href=\"https:\/\/www.gencayyildiz.com\/blog\/arayuz-ayrim-prensibiinterface-segregation-principle-isp\/\" rel=\"noopener\" target=\"_blank\">Aray\u00fcz Ayr\u0131m Prensibi<\/a>ne ayk\u0131r\u0131 olabilir. Bunu engellemek i\u00e7in <em>Component<\/em>&#8216;i ikiye ay\u0131r\u0131p composite fonksiyonlar\u0131n\u0131 farkl\u0131 bir aray\u00fcze alabilir ve <em>Composite<\/em> nesneleri o aray\u00fczden t\u00fcretebilirsiniz.<\/p>\n<p>Evet, b\u00f6ylece bir design pattern makalesinin daha sonuna gelmi\u015f olduk. Sonraki sayfalarda konuya dair farkl\u0131 senaryolarda bol pratik \u00f6rnekler sergilemekteyim. Kesinlikle g\u00f6z atman\u0131z\u0131 ve m\u00fcmk\u00fcnse teoride b\u0131rakmay\u0131p pratik ile desteklemenizi tavsiye ederim.<\/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><!--nextpage--><\/p>\n<table>\n<thead>\n<tr>\n<th style=\"color:red;\">SENARYO 2<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"color:#EEF2F5;background-color:gray;font-size:13px;\">Bir \u015firkette a\u015fa\u011f\u0131daki hiyerar\u015fide personel pozisyonlar\u0131 bulunmaktad\u0131r.<\/p>\n<ul style=\"text-align:left;\">\n<li>Proje Y\u00f6neticisi\n<ul>\n<li>Tak\u0131m Lideri\n<ul>\n<li>Yaz\u0131l\u0131m Geli\u015ftirici<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Her bir pozisyonda bulunan personel, hiyerar\u015fik olarak kendisinden sonra gelen herhangi bir pozisyondaki personeli maiyetinde bar\u0131nd\u0131rabilmektedir.<\/p>\n<p>Bu senaryoda herhangi bir pozisyondaki personelin, maiyetindeki personellerin bilgilerini ve toplam maa\u015flar\u0131n\u0131 hesaplay\u0131p kar\u015f\u0131l\u0131\u011f\u0131na yazd\u0131ral\u0131m.\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<table>\n<thead>\n<tr>\n<th style=\"color:red;\">\u00c7\u00d6Z\u00dcM<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size:13px;text-align:left;\">\n<ul>\n<li><em><strong>Ad\u0131m 1<\/strong> <span style=\"color:green;\">(Component Soyut S\u0131n\u0131f\u0131n\u0131n Tasarlanmas\u0131)<\/span><\/em><br \/>\nComposite pattern&#8217;\u0131n tasar\u0131m\u0131nda ilk olarak <em>Leaf<\/em> ve <em>Composite<\/em> nesnelerimizin ortak aray\u00fcz\u00fc olan <em>Component<\/em> abstract class&#8217;\u0131 tasarlanarak ba\u015flanmaktad\u0131r. Haliyle bizler de vakit kaybetmeksizin ilk olarak ilgili s\u0131n\u0131f\u0131 olu\u015fturarak ba\u015fl\u0131yoruz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Component\r\n    public abstract class Employee\r\n    {\r\n        protected string _name;\r\n        protected double _salary;\r\n        protected Employee(string name, double salary)\r\n        {\r\n            _name = name;\r\n            _salary = salary;\r\n        }\r\n\r\n        public string GetName()\r\n            =&gt; _name;\r\n        public double GetSalary()\r\n            =&gt; _salary;\r\n        public abstract void Print();\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki &#8216;Employee&#8217; ad\u0131yla tasarlanan <em>Component<\/em> s\u0131n\u0131f\u0131 direkt <em>Leaf<\/em> ve <em>Composite<\/em> nesnelerinin kullanabilece\u011fi \u015fekilde ortak member&#8217;larla tasarlanm\u0131\u015ft\u0131r. Sadece <em>Composite<\/em> nesnelerine \u00f6zel fonksiyonlar\u0131 bar\u0131nd\u0131ran <em>Component<\/em> tasar\u0131m\u0131 ise a\u015fa\u011f\u0131daki olacakt\u0131r. B\u00f6ylece hem <em>Leaf<\/em> nesnelerinde anlams\u0131z member&#8217;lar olmayacak hem de <a href=\"https:\/\/www.gencayyildiz.com\/blog\/arayuz-ayrim-prensibiinterface-segregation-principle-isp\/\" rel=\"noopener\" target=\"_blank\">aray\u00fcz ayr\u0131m prensibi<\/a>ni sa\u011flam\u0131\u015f bulunaca\u011f\u0131z.<\/p>\n<p>Ayr\u0131ca yukar\u0131daki Component \u00f6rne\u011finde &#8216;GetName&#8217; ve &#8216;GetSalary&#8217; metotlar\u0131n\u0131n g\u00f6vdeleri direkt olu\u015fturulmu\u015fken, &#8216;Print&#8217; metodunun g\u00f6vdesi concrete olacak olan <em>Composite<\/em> ve <em>Leaf<\/em> nesnelerine b\u0131rak\u0131lm\u0131\u015ft\u0131r. Nihayetinde bu kod, buradaki davran\u0131\u015f\u0131n ihtiyaca g\u00f6re taraf\u0131m\u0131zca belirlendi\u011fine bir \u00f6rnektir. Misal bizim concrete nesnelerde maa\u015flarla ilgili ekstradan i\u015flemler yapmam\u0131z gerekseydi &#8216;GetSalary&#8217; metodu abstract olarak ayarlay\u0131p, bu i\u015fi ilgili nesnesinde in\u015faya b\u0131rakabilirdik. Ama gerekmedi\u011fi i\u00e7in k\u0131ssadan hisse yap\u0131p gerekli i\u015flemi burada ger\u00e7ekle\u015ftirmekteyiz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Component\r\n    public abstract class EmployeeComposite : Employee\r\n    {\r\n        protected List&lt;Employee&gt; _employees = new();\r\n        protected EmployeeComposite(string name, double salary) : base(name, salary)\r\n        {\r\n        }\r\n        public void AddEmployee(Employee employee)\r\n            =&gt; _employees.Add(employee);\r\n        public void RemoveEmployee(Employee employee)\r\n            =&gt; _employees.Remove(employee);\r\n    }\r\n<\/pre>\n<p><em>Composite<\/em> nesneleri i\u00e7in \u00f6zel olan fonksiyonlar\u0131 bar\u0131nd\u0131ran <em>Component<\/em> soyut s\u0131n\u0131f\u0131m\u0131zda yukar\u0131daki gibi olacakt\u0131r. Burada da &#8216;AddEmployee&#8217; ve &#8216;RemoveEmployee&#8217; metotlar\u0131n\u0131n g\u00f6vdelerini ayn\u0131 mant\u0131kla concrete olan <em>Composite<\/em> nesnelerine b\u0131rakmaks\u0131z\u0131n direkt olarak in\u015fa etmi\u015f bulunmaktay\u0131z. Haliyle ilgili metotlar sadece ekleme ve \u00e7\u0131karma i\u015flemleri yapacaklar\u0131ndan ve ekstra bir i\u015f y\u00fcr\u00fctmeyeceklerinden dolay\u0131 direkt bu ihtiyac\u0131 burada kar\u015f\u0131lam\u0131\u015f bulunmaktay\u0131z.\n<\/li>\n<li><em><strong>Ad\u0131m 2<\/strong> <span style=\"color:green;\">(Composite S\u0131n\u0131f\u0131n\u0131n Tasarlanmas\u0131)<\/span><\/em><br \/>\n\u015eimdi s\u0131ra, senaryo gere\u011fi alt\u0131nda en az bir pozisyondan personel bar\u0131nd\u0131racak olan <em>Composite<\/em> s\u0131n\u0131f\u0131n\u0131 tasarlamaya gelmi\u015f bulunmaktad\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Component\r\n    public class Manager : EmployeeComposite\r\n    {\r\n        public Manager(string name, double salary) : base(name, salary)\r\n        {\r\n        }\r\n        public override void Print()\r\n        {\r\n            Console.WriteLine($&quot;Name\\t\\t:{GetName()}&quot;);\r\n            Console.WriteLine($&quot;Salary\\t\\t:{GetSalary()}&quot;);\r\n            double totalSalary = 0;\r\n            _employees.ForEach(employee =&gt;\r\n            {\r\n                totalSalary += employee.GetSalary();\r\n                employee.Print();\r\n            });\r\n            Console.WriteLine($&quot;Total Salary\\t:{totalSalary}&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki &#8216;Manager&#8217; isimli <em>Component<\/em> s\u0131n\u0131f\u0131na g\u00f6z atarsan\u0131z e\u011fer &#8216;Print&#8217; fonksiyonu ile ilgili personelin ad\u0131n\u0131 ve maa\u015f\u0131n\u0131 ekrana yazd\u0131rmakla birlikte alt\u0131ndaki elemanlar\u0131n da(ki bu elemanlar normal personel olabilece\u011fi gibi y\u00f6netici pozisyonunda bir personel de olabilir) toplam maa\u015f\u0131n\u0131 hesaplamakta ve &#8216;Print&#8217; fonksiyonlar\u0131n\u0131 tetikleyerek onlara dair bilgileri ekrana yazd\u0131rmaktad\u0131r.\n<\/li>\n<li><em><strong>Ad\u0131m 3<\/strong> <span style=\"color:green;\">(Leaf S\u0131n\u0131f\u0131n\u0131n Tasarlanmas\u0131)<\/span><\/em><br \/>\n\u015eimdi ise alt\u0131nda herhangi bir pozisyondan personel bar\u0131nd\u0131rmayan personelleri temsil edecek olan <em>Leaf<\/em> s\u0131n\u0131f\u0131n\u0131 tasarlamaya s\u0131ra gelmi\u015ftir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Leaf\r\n    public class SoftwareDeveloper : Employee\r\n    {\r\n        public SoftwareDeveloper(string name, double salary) : base(name, salary)\r\n        {\r\n        }\r\n        public override void Print()\r\n        {\r\n            Console.WriteLine($&quot;\\tName\\t\\t:{GetName()}&quot;);\r\n            Console.WriteLine($&quot;\\tSalary\\t\\t:{GetSalary()}&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki &#8216;SoftwareDeveloper&#8217; isimli <em>Leaf<\/em> nesnesinde ise &#8216;Print&#8217; fonksiyonuyla sadece ilgili personele dair ad\u0131 ve maa\u015f bilgileri ekrana yazd\u0131r\u0131lmaktad\u0131r.\n<\/li>\n<li><em><strong>Ad\u0131m 4<\/strong> <span style=\"color:green;\">(Test)<\/span><\/em><br \/>\nBu ana kadar dikkat ederseniz; &#8216;Proje Y\u00f6neticisi&#8217; ve &#8216;Tak\u0131m Lideri&#8217; pozisyonlar\u0131 &#8216;Manager&#8217; s\u0131n\u0131f\u0131yla, &#8216;Yaz\u0131l\u0131m Geli\u015ftirici&#8217; pozisyonu ise &#8216;SoftwareDeveloper&#8217; s\u0131n\u0131f\u0131yla temsil edilmektedir. Art\u0131k yap\u0131lan bu tasar\u0131m\u0131 rahatl\u0131kla test edebiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            Manager projectManager = new(&quot;Ahmet&quot;, 1000);\r\n            Manager teamLeader1 = new(&quot;Mehmet&quot;, 500);\r\n            Manager teamLeader2 = new(&quot;Hilmi&quot;, 450);\r\n\r\n            SoftwareDeveloper softwareDeveloper1 = new(&quot;\u00c7o\u015fgun&quot;, 250);\r\n            SoftwareDeveloper softwareDeveloper2 = new(&quot;Murat&quot;, 150);\r\n            SoftwareDeveloper softwareDeveloper3 = new(&quot;Lale&quot;, 160);\r\n            SoftwareDeveloper softwareDeveloper4 = new(&quot;C\u00fcmb\u00fc\u015f&quot;, 270);\r\n\r\n            teamLeader1.AddEmployee(softwareDeveloper1);\r\n            teamLeader1.AddEmployee(softwareDeveloper2);\r\n            teamLeader1.AddEmployee(softwareDeveloper3);\r\n            teamLeader2.AddEmployee(softwareDeveloper4);\r\n\r\n            projectManager.AddEmployee(teamLeader1);\r\n            projectManager.AddEmployee(teamLeader2);\r\n\r\n            projectManager.Print();\r\n        }\r\n<\/pre>\n<p>Yukar\u0131daki \u00f6rnek kodu derleyip, \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda a\u015fa\u011f\u0131daki \u00e7\u0131kt\u0131y\u0131 verecektir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/11\/C-Composite-Design-PatternComposite-Tasarim-Deseni.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/11\/C-Composite-Design-PatternComposite-Tasarim-Deseni.jpg\" alt=\"C# Composite Design Pattern(Composite Tasar\u0131m Deseni)\" width=\"384\" height=\"416\" class=\"aligncenter size-full wp-image-23591\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/11\/C-Composite-Design-PatternComposite-Tasarim-Deseni.jpg 384w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/11\/C-Composite-Design-PatternComposite-Tasarim-Deseni-277x300.jpg 277w\" sizes=\"auto, (max-width: 384px) 100vw, 384px\" \/><\/a><br \/>\nG\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere t\u00fcm pozisyonlardaki personellerin ve maiyetlerindeki di\u011fer personellerin toplam maa\u015fla birlikte bilgileri yazd\u0131r\u0131lm\u0131\u015f bulunmaktad\u0131r.\n<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<p><!--nextpage--><\/p>\n<table>\n<thead>\n<tr>\n<th style=\"color:red;\">SENARYO 3<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"color:#EEF2F5;background-color:gray;font-size:13px;\">\nBir uygulamadaki hiyerar\u015fik men\u00fclerin Composite pattern ile tasar\u0131m\u0131n\u0131 ger\u00e7ekle\u015ftirelim.\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<table>\n<thead>\n<tr>\n<th style=\"color:red;\">\u00c7\u00d6Z\u00dcM<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size:13px;text-align:left;\">\n<ul>\n<li><em><strong>Ad\u0131m 1<\/strong> <span style=\"color:green;\">(Component Soyut S\u0131n\u0131f\u0131n\u0131n Tasarlanmas\u0131)<\/span><\/em><br \/>\nBir men\u00fc, tek seviyelik bir men\u00fc olabilece\u011fi gibi(<em>Leaf<\/em>), alt\u0131nda birden fazla farkl\u0131 men\u00fc bar\u0131nd\u0131ran karma\u015f\u0131k(<em>Composite<\/em>) bir men\u00fcde olabilir. Haliyle her iki t\u00fcrl\u00fcde ilgili men\u00fclerin ortak alanlar\u0131n\u0131 bar\u0131nd\u0131racak olan <em>Component<\/em> aray\u00fcz\u00fcn\u00fc tasarlayal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Component\r\n    abstract class Menu\r\n    {\r\n        protected string _name;\r\n        protected string _description;\r\n        protected Menu(string name, string description)\r\n        {\r\n            _name = name;\r\n            _description = description;\r\n        }\r\n        public string GetName()\r\n            =&gt; _name;\r\n        public string GetDescription()\r\n            =&gt; _description;\r\n        public abstract void Print(int level = 0);\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Component\r\n    abstract class MenuComposite : Menu\r\n    {\r\n        protected List&lt;Menu&gt; _menus = new();\r\n        public MenuComposite(string name, string description) : base(name, description)\r\n        {\r\n        }\r\n        public void AddMenu(Menu menu)\r\n            =&gt; _menus.Add(menu);\r\n        public void RemoveMenu(Menu menu)\r\n            =&gt; _menus.Remove(menu);\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki &#8216;Menu&#8217; <em>Component<\/em> aray\u00fcz\u00fcndeki &#8216;Print&#8217; fonksiyonuna g\u00f6z atarsan\u0131z e\u011fer int t\u00fcr\u00fcnden &#8216;level&#8217; isminde bir parametre almaktad\u0131r. Bunun sebebi, ilgili men\u00fcleri listelerken derecelerine g\u00f6re i\u00e7e k\u0131vr\u0131ml\u0131 bir \u015fekilde g\u00f6rsellik olu\u015fturabilmek i\u00e7indir.\n<\/li>\n<li><em><strong>Ad\u0131m 2<\/strong> <span style=\"color:green;\">(Composite S\u0131n\u0131f\u0131n\u0131n Tasarlanmas\u0131)<\/span><\/em><br \/>\nArd\u0131ndan s\u0131rada <em>Leaf<\/em> ve <em>Composite<\/em> nesneleri olu\u015fturmak vard\u0131r. Siz istedi\u011finizden ba\u015flayabilirsiniz. Ben deniz <em>Composite<\/em> nesneyi tasarlayarak devam ediyorum.<\/p>\n<div style=\"width:690px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Composite\r\n    class MenuItems : MenuComposite\r\n    {\r\n        public MenuItems(string name, string description) : base(name, description)\r\n        {\r\n        }\r\n\r\n        public override void Print(int level = 0)\r\n        {\r\n            Console.WriteLine($&quot;{(level == 0 ? &quot;&quot; : &quot;\\t&quot;.PadRight(level, '\\t'))}{GetName()} {{{GetDescription()}}}&quot;);\r\n            foreach (Menu menu in _menus)\r\n                menu.Print(menu is MenuComposite ? level + 1 : level + 2);\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<\/li>\n<li><em><strong>Ad\u0131m 3<\/strong> <span style=\"color:green;\">(Leaf S\u0131n\u0131f\u0131n\u0131n Tasarlanmas\u0131)<\/span><\/em><br \/>\nBenzer \u015fekilde <em>Leaf<\/em> nesnesini de tasarlarsak e\u011fer;<\/p>\n<div style=\"width:690px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class MenuItem : Menu\r\n    {\r\n        public MenuItem(string name, string description) : base(name, description)\r\n        {\r\n        }\r\n\r\n        public override void Print(int level = 0)\r\n            =&gt; Console.WriteLine($&quot;{&quot;\\t&quot;.PadRight(level, '\\t')}{GetName()} {{{GetDescription()}}}&quot;);\r\n    }\r\n<\/pre>\n<\/div>\n<\/li>\n<li><em><strong>Ad\u0131m 4<\/strong> <span style=\"color:green;\">(Test)<\/span><\/em><br \/>\nEvet, g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere tasar\u0131msal in\u015fa tamamlanm\u0131\u015f bulunmaktad\u0131r. \u015eimdi s\u0131ra in\u015fa edilen bu tasar\u0131m\u0131 test etmeye gelmi\u015ftir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            MenuItems menuItems1 = new(&quot;Ana Men\u00fc 1&quot;, &quot;Bu ana men\u00fc 1'dir...&quot;);\r\n            menuItems1.AddMenu(new MenuItem(&quot;Men\u00fc 1&quot;, &quot;Bu alt men\u00fc 1'dir...&quot;));\r\n            menuItems1.AddMenu(new MenuItem(&quot;Men\u00fc 2&quot;, &quot;Bu alt men\u00fc 2'dir...&quot;));\r\n            menuItems1.AddMenu(new MenuItem(&quot;Men\u00fc 3&quot;, &quot;Bu alt men\u00fc 3'dir...&quot;));\r\n\r\n            MenuItems menuItems2 = new(&quot;Ana Men\u00fc 2&quot;, &quot;Bu ana men\u00fc 2'dir...&quot;);\r\n            menuItems2.AddMenu(new MenuItem(&quot;Men\u00fc 4&quot;, &quot;Bu alt men\u00fc 4'd\u00fcr...&quot;));\r\n\r\n            MenuItems menuItems3 = new(&quot;Ana Men\u00fc 3&quot;, &quot;Bu ana men\u00fc 3'd\u00fcr...&quot;);\r\n            menuItems3.AddMenu(new MenuItem(&quot;Men\u00fc 5&quot;, &quot;Bu alt men\u00fc 5'dir...&quot;));\r\n            menuItems3.AddMenu(new MenuItem(&quot;Men\u00fc 6&quot;, &quot;Bu alt men\u00fc 6'dir...&quot;));\r\n            menuItems3.AddMenu(new MenuItem(&quot;Men\u00fc 7&quot;, &quot;Bu alt men\u00fc 7'dir...&quot;));\r\n\r\n            menuItems1.AddMenu(menuItems2);\r\n            menuItems1.AddMenu(menuItems3);\r\n\r\n            menuItems2.AddMenu(new MenuItem(&quot;Men\u00fc 8&quot;, &quot;Bu alt men\u00fc 8'dir...&quot;));\r\n\r\n            MenuItems menuItems4 = new(&quot;Ana Men\u00fc 4&quot;, &quot;Bu ana men\u00fc 4'd\u00fcr...&quot;);\r\n            menuItems4.AddMenu(new MenuItem(&quot;Men\u00fc 9&quot;, &quot;Bu alt men\u00fc 9'dur...&quot;));\r\n            menuItems4.AddMenu(new MenuItem(&quot;Men\u00fc 10&quot;, &quot;Bu alt men\u00fc 10'dur...&quot;));\r\n            menuItems4.AddMenu(new MenuItem(&quot;Men\u00fc 11&quot;, &quot;Bu alt men\u00fc 11'dur...&quot;));\r\n\r\n            MenuItems menuItems5 = new(&quot;Ana Men\u00fc 5&quot;, &quot;Bu ana men\u00fc 5'dir...&quot;);\r\n            menuItems5.AddMenu(new MenuItem(&quot;Men\u00fc 12&quot;, &quot;Bu alt men\u00fc 12'dir...&quot;));\r\n            menuItems5.AddMenu(new MenuItem(&quot;Men\u00fc 13&quot;, &quot;Bu alt men\u00fc 13'dir...&quot;));\r\n            menuItems5.AddMenu(new MenuItem(&quot;Men\u00fc 14&quot;, &quot;Bu alt men\u00fc 14'dir...&quot;));\r\n\r\n            menuItems4.AddMenu(menuItems5);\r\n            menuItems3.AddMenu(menuItems4);\r\n\r\n            menuItems1.Print();\r\n        }\r\n<\/pre>\n<p>Yukar\u0131daki dolu dizgin men\u00fc verisiyle doldurulmu\u015f \u00f6rnek kod blo\u011funu derleyip, \u00e7al\u0131\u015ft\u0131r\u0131rsak e\u011fer a\u015fa\u011f\u0131daki gibi bir ekran \u00e7\u0131kt\u0131s\u0131yla kar\u015f\u0131laca\u011f\u0131z.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/11\/C-Composite-Design-PatternComposite-Tasarim-Deseni-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/11\/C-Composite-Design-PatternComposite-Tasarim-Deseni-1.jpg\" alt=\"C# Composite Design Pattern(Composite Tasar\u0131m Deseni)\" width=\"572\" height=\"308\" class=\"aligncenter size-full wp-image-23601\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/11\/C-Composite-Design-PatternComposite-Tasarim-Deseni-1.jpg 572w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/11\/C-Composite-Design-PatternComposite-Tasarim-Deseni-1-300x162.jpg 300w\" sizes=\"auto, (max-width: 572px) 100vw, 572px\" \/><\/a>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere her men\u00fc seviyesine g\u00f6re i\u00e7e k\u0131vr\u0131ml\u0131 bir \u015fekilde men\u00fcler ekrana listeletilmi\u015ftir.\n<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u0130yi \u00e7al\u0131\u015flar&#8230;<\/p>\n<p><!--nextpage--><\/p>\n<table>\n<thead>\n<tr>\n<th style=\"color:red;\">SENARYO 4<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"color:#EEF2F5;background-color:gray;font-size:13px;\">\nBilgisayar ve bilgisayar par\u00e7alar\u0131 sat\u0131\u015f\u0131 yapan bir ma\u011fazan\u0131n, bilgisayar toplama s\u00fcrecini Composite pattern ile sim\u00fcle edelim. Her bir bilgisayar par\u00e7as\u0131n\u0131n fiyat\u0131n\u0131 g\u00f6rebilelim ve bilgisayar topland\u0131\u011f\u0131 taktirde toplam maliyeti de elde edebilelim.\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<table>\n<thead>\n<tr>\n<th style=\"color:red;\">\u00c7\u00d6Z\u00dcM<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size:13px;text-align:left;\">\n<ul>\n<li><em><strong>Ad\u0131m 1<\/strong> <span style=\"color:green;\">(Component Soyut S\u0131n\u0131f\u0131n\u0131n Tasarlanmas\u0131)<\/span><\/em><br \/>\nHer\u015feyden \u00f6nce bilgisayardaki t\u00fcm par\u00e7alar\u0131 temsil edecek olan <em>Component<\/em> aray\u00fcz\u00fcn\u00fc tasarlayarak ba\u015flayal\u0131m.<\/p>\n<p>\u00c7o\u011fu bilgisayar par\u00e7as\u0131 tek ba\u015f\u0131na kullan\u0131lmaktad\u0131r. Dolay\u0131s\u0131yla a\u015fa\u011f\u0131daki <em>Component<\/em> ilkel yani <em>Leaf<\/em> olarak nitelendirebilece\u011fimiz bilgisayar par\u00e7ar\u0131n\u0131 temsil edecektir.<\/p>\n<div style=\"width:690px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Component\r\n    abstract class Part\r\n    {\r\n        protected string _brand;\r\n        protected double _price;\r\n        protected Part(string brand, double price)\r\n        {\r\n            _brand = brand;\r\n            _price = price;\r\n        }\r\n        public virtual double GetPrice()\r\n            =&gt; _price;\r\n        public string GetBrand()\r\n            =&gt; _brand;\r\n    }\r\n<\/pre>\n<\/div>\n<p>Kimi par\u00e7alarda birden fazla par\u00e7an\u0131n tak\u0131lmas\u0131yla meydana gelir. Genel anlamda bu par\u00e7adan ziyade bilgisayar\u0131n ta kendisidir de diyebiliriz. Haliyle \u015fimdide de <em>Composite<\/em> nitelikteki par\u00e7alar\u0131 ya da bilgisayar\u0131 temsil edecek olan <em>Component<\/em>&#8216;i tasarlayal\u0131m.<\/p>\n<div style=\"width:690px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Component\r\n    abstract class PartComposite : Part\r\n    {\r\n        protected List&lt;Part&gt; _parts = new();\r\n        protected PartComposite(string brand, double price) : base(brand, price)\r\n        {\r\n        }\r\n        public void AddPart(Part part)\r\n            =&gt; _parts.Add(part);\r\n        public void RemovePart(Part part)\r\n            =&gt; _parts.Add(part);\r\n        public override double GetPrice()\r\n        {\r\n            double totalPrice = _price;\r\n            Console.WriteLine($&quot;{_brand} \\t\\t: {_price}&quot;);\r\n            foreach (Part part in _parts)\r\n            {\r\n                Console.WriteLine($&quot;\\t{part.GetBrand()} \\t: {part.GetPrice()}&quot;);\r\n                totalPrice += part.GetPrice();\r\n            }\r\n            return totalPrice;\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer &#8216;Part&#8217; s\u0131n\u0131f\u0131nda <code>virtual<\/code> olarak ayarlanm\u0131\u015f olan &#8216;GetPrice&#8217; metodu &#8216;PartComposite&#8217; s\u0131n\u0131f\u0131nda <code>override<\/code> edilerek i\u00e7erisinde t\u00fcm <em>Composite<\/em> nesneler i\u00e7in hali haz\u0131rda toplam maliyet hesaplamas\u0131 yap\u0131lmaktad\u0131r. Bu i\u015flemi tek tek Composite nesnelerde de yapabilirdik lakin tek elden burada yapmak hem daha az maliyetli hem de ekstralara ihtiya\u00e7 olmad\u0131\u011f\u0131 i\u00e7in daha do\u011fru olacakt\u0131r.\n<\/li>\n<li><em><strong>Ad\u0131m 2<\/strong> <span style=\"color:green;\">(Composite S\u0131n\u0131f\u0131n\u0131n Tasarlanmas\u0131)<\/span><\/em><br \/>\nBen senaryo gere\u011fi t\u00fcm par\u00e7alar\u0131n birle\u015ftirilmi\u015f hali bilgisayar olarak d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcmden dolay\u0131 <em>Composite<\/em> nesne olarak da bilgisayar\u0131 temsil edece\u011fim. Buradaki tercih sizlere kalm\u0131\u015f. Farkl\u0131 par\u00e7alar\u0131 da <em>Composite<\/em> olarak temsil edebilir ve tasarlayabilirsiniz.<\/p>\n<div style=\"width:690px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Composite\r\n    class Computer : PartComposite\r\n    {\r\n        public Computer(string brand, double price) : base(brand, price)\r\n        {\r\n        }\r\n    }\r\n<\/pre>\n<p><em>Composite<\/em> s\u0131n\u0131f\u0131m\u0131z\u0131n g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere yukar\u0131daki gibi &#8216;PartComposite&#8217;den kal\u0131t\u0131m alacak \u015fekilde tasarlanmas\u0131 yeterlidir. Nihayetinde alt par\u00e7alar\u0131 bar\u0131nd\u0131ran koleksiyon dahil gerekli t\u00fcm fonksiyonlar base class&#8217;tan geliyor olacakt\u0131r.\n<\/div>\n<\/li>\n<li><em><strong>Ad\u0131m 3<\/strong> <span style=\"color:green;\">(Leaf S\u0131n\u0131f\u0131n\u0131n Tasarlanmas\u0131)<\/span><\/em><br \/>\n\u015eimdi s\u0131ra <em>Leaf<\/em> s\u0131n\u0131flar\u0131m\u0131z\u0131 tasarlamaya gelmi\u015f bulunmaktad\u0131r. S\u0131n\u0131flar\u0131m\u0131z\u0131 diyorum \u00e7\u00fcnk\u00fc birden fazla bilgisayar par\u00e7as\u0131 mevcuttur. Dolay\u0131s\u0131yla t\u00fcm par\u00e7alara kar\u015f\u0131l\u0131k bir nesne tasar\u0131m\u0131 ger\u00e7ekle\u015ftirece\u011fiz.(Tabi burada tek bir nesne \u00fczerinden de her bir <em>Leaf<\/em>&#8216;i instance olarak temsil edebilirdik. Haliyle b\u00f6yle bir yakla\u015f\u0131m\u0131n karar\u0131 sizinle ihtiya\u00e7lar\u0131n\u0131za kalm\u0131\u015ft\u0131r)<\/p>\n<div style=\"width:690px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Leaf\r\n    class Monitor : Part\r\n    {\r\n        public Monitor(string brand, double price) : base(brand, price)\r\n        {\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<div style=\"width:690px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Leaf\r\n    class Keyboard : Part\r\n    {\r\n        public Keyboard(string brand, double price) : base(brand, price)\r\n        {\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<div style=\"width:690px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Leaf\r\n    class Ram : Part\r\n    {\r\n        public Ram(string brand, double price) : base(brand, price)\r\n        {\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<div style=\"width:690px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Leaf\r\n    class Mouse : Part\r\n    {\r\n        public Mouse(string brand, double price) : base(brand, price)\r\n        {\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<\/li>\n<li><em><strong>Ad\u0131m 4<\/strong> <span style=\"color:green;\">(Test)<\/span><\/em><br \/>\nHaliyle s\u0131ra son olarak yap\u0131lan bu tasar\u0131m\u0131 test etmeye gelmi\u015ftir.<\/p>\n<div style=\"width:690px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            Computer computer = new(&quot;Asus&quot;, 10000);\r\n            computer.AddPart(new Monitor(&quot;Asus&quot;, 2750));\r\n            computer.AddPart(new Keyboard(&quot;A4Tech&quot;, 750));\r\n            computer.AddPart(new Ram(&quot;XXX&quot;, 1750));\r\n            computer.AddPart(new Mouse(&quot;Hp&quot;, 125));\r\n\r\n            double totalPrice = computer.GetPrice();\r\n            Console.WriteLine($&quot;Toplam Fiyat \\t: {totalPrice}&quot;);\r\n        }\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki kod blo\u011funu derleyip, \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcyle kar\u015f\u0131la\u015faca\u011f\u0131z.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/11\/C-Composite-Design-PatternComposite-Tasarim-Deseni-2.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/11\/C-Composite-Design-PatternComposite-Tasarim-Deseni-2.jpg\" alt=\"C# Composite Design Pattern(Composite Tasar\u0131m Deseni)\" width=\"194\" height=\"102\" class=\"aligncenter size-full wp-image-23621\" \/><\/a>\u0130\u015fte bu kadar \ud83d\ude42<\/p>\n<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u0130yi \u00e7al\u0131\u015fmalar&#8230;<br \/>\n<!--nextpage--><\/p>\n<table>\n<thead>\n<tr>\n<th style=\"color:red;\">SENARYO 5<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"color:#EEF2F5;background-color:gray;font-size:13px;\">\nBir firma ayl\u0131k olarak personellerine \u00f6dedi\u011fi maa\u015flar\u0131n raporlanabilece\u011fi bir uygulama istemektedir. Firma b\u00fcnyesinde a\u015fa\u011f\u0131daki gibi bir hiyerar\u015fi mevcuttur;<\/p>\n<ul style=\"text-align:left;\">\n<li>Genel m\u00fcd\u00fcrl\u00fck\n<ul>\n<li>M\u00fcd\u00fcrl\u00fck\n<ul>\n<li>B\u00f6lge\n<ul>\n<li>Bayi\n<ul>\n<li>Personel<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Bu hiyerar\u015fide; genel m\u00fcd\u00fcrl\u00fc\u011fe ba\u011fl\u0131 m\u00fcd\u00fcrl\u00fckler, m\u00fcd\u00fcrl\u00fcklere ba\u011fl\u0131 b\u00f6lgeler, b\u00f6lgelere ba\u011fl\u0131 bayiler ve son olarak bu bayilerde \u00e7al\u0131\u015fan personeller oldu\u011fu g\u00f6r\u00fclmektedir.<br \/>\nFirma maa\u015f hesaplamay\u0131, hem t\u00fcm \u015firket i\u00e7in genel olarak hem de hususi m\u00fcd\u00fcrl\u00fck, b\u00f6lge, bayi gibi farkl\u0131 hiyerar\u015fi seviyeleri i\u00e7in \u00f6zel olarak istemektedir.\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<table>\n<thead>\n<tr>\n<th style=\"color:red;\">\u00c7\u00d6Z\u00dcM<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size:13px;text-align:left;\">\n<ul>\n<li><em><strong>Ad\u0131m 1<\/strong> <span style=\"color:green;\">(Component Soyut S\u0131n\u0131f\u0131n\u0131n Tasarlanmas\u0131)<\/span><\/em>\n<div style=\"width:690px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Component\r\n    abstract class Personnel\r\n    {\r\n        protected string _name;\r\n        public double Salary { get; set; }\r\n        protected Personnel(string name)\r\n        {\r\n            _name = name;\r\n        }\r\n        public virtual double ComputeSalary()\r\n        {\r\n            Console.WriteLine($&quot;{_name} -&gt; Price : {Salary}&quot;);\r\n            return Salary;\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<div style=\"width:690px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Component\r\n    abstract class PersonnelComposite : Personnel\r\n    {\r\n        protected List&lt;Personnel&gt; _personnels = new();\r\n        protected PersonnelComposite(string name) : base(name)\r\n        {\r\n        }\r\n\r\n        public void AddPersonnel(Personnel personnel)\r\n            =&gt; _personnels.Add(personnel);\r\n        public void RemovePersonnel(Personnel personnel)\r\n            =&gt; _personnels.Remove(personnel);\r\n        public override double ComputeSalary()\r\n        {\r\n            double totalSalary = 0;\r\n            foreach (Personnel personnel in _personnels)\r\n                totalSalary += personnel.ComputeSalary();\r\n\r\n            Console.WriteLine($&quot;{_name} Total Salary : ${totalSalary}&quot;);\r\n            Console.WriteLine(&quot;******************&quot;);\r\n            return totalSalary;\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<\/li>\n<li><em><strong>Ad\u0131m 2<\/strong> <span style=\"color:green;\">(Composite S\u0131n\u0131f\u0131n\u0131n Tasarlanmas\u0131)<\/span><\/em>\n<div style=\"width:690px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Composite\r\n    class GeneralDirectorate : PersonnelComposite\r\n    {\r\n        public GeneralDirectorate(string name) : base(name)\r\n        {\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<div style=\"width:690px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Composite\r\n    class Director : PersonnelComposite\r\n    {\r\n        public Director(string name) : base(name)\r\n        {\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<div style=\"width:690px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Composite\r\n    class Area : PersonnelComposite\r\n    {\r\n        public Area(string name) : base(name)\r\n        {\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<div style=\"width:690px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Composite \r\n    class Seller : PersonnelComposite\r\n    {\r\n        public Seller(string name) : base(name)\r\n        {\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<\/li>\n<li><em><strong>Ad\u0131m 3<\/strong> <span style=\"color:green;\">(Leaf S\u0131n\u0131f\u0131n\u0131n Tasarlanmas\u0131)<\/span><\/em>\n<div style=\"width:690px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Leaf \r\n    class Worker : Personnel\r\n    {\r\n        public Worker(string name) : base(name)\r\n        {\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<\/li>\n<li><em><strong>Ad\u0131m 4<\/strong> <span style=\"color:green;\">(Test)<\/span><\/em>\n<div style=\"width:690px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            \/\/\u0130\u015f\u00e7iler tan\u0131mlan\u0131yor\r\n            Worker personnel1 = new(&quot;Ahmet&quot;) { Salary = 10000 };\r\n            Worker personnel2 = new(&quot;Mehmet&quot;) { Salary = 8000 };\r\n            Worker personnel3 = new(&quot;Necati&quot;) { Salary = 12000 };\r\n            Worker personnel4 = new(&quot;Hilmi&quot;) { Salary = 7000 };\r\n            Worker personnel5 = new(&quot;R\u0131fk\u0131&quot;) { Salary = 3000 };\r\n            Worker personnel6 = new(&quot;Muiddin&quot;) { Salary = 2500 };\r\n            Worker personnel7 = new(&quot;Rauf&quot;) { Salary = 13000 };\r\n            Worker personnel8 = new(&quot;\u015euayip&quot;) { Salary = 15000 };\r\n\r\n            \/\/Bayiler tan\u0131mlan\u0131yor\r\n            Seller seller1 = new(&quot;Yenimahalle Bayi&quot;);\r\n            Seller seller2 = new(&quot;\u00c7ankaya Bayi&quot;);\r\n            Seller seller3 = new(&quot;Bah\u00e7elievler Bayi&quot;);\r\n\r\n            \/\/\u0130\u015f\u00e7iler \u00e7al\u0131\u015ft\u0131klar\u0131 bayilere ekleniyor\r\n            seller1.AddPersonnel(personnel1);\r\n            seller1.AddPersonnel(personnel2);\r\n            seller1.AddPersonnel(personnel3);\r\n\r\n            seller2.AddPersonnel(personnel4);\r\n            seller2.AddPersonnel(personnel5);\r\n            seller2.AddPersonnel(personnel6);\r\n\r\n            seller3.AddPersonnel(personnel7);\r\n            seller3.AddPersonnel(personnel8);\r\n\r\n            \/\/B\u00f6lgeler tan\u0131mlan\u0131yor\r\n            Area area1 = new(&quot;Ankara B\u00f6lgesi&quot;);\r\n            Area area2 = new(&quot;\u0130stanbul B\u00f6lgesi&quot;);\r\n\r\n            \/\/B\u00f6lgelere bayiler ekleniyor\r\n            area1.AddPersonnel(seller1);\r\n            area1.AddPersonnel(seller2);\r\n            area2.AddPersonnel(seller3);\r\n\r\n            \/\/M\u00fcd\u00fcrler tan\u0131mlan\u0131yor\r\n            Director director1 = new(&quot;Kuzey Grubu M\u00fcd\u00fcr\u00fc&quot;);\r\n            Director director2 = new(&quot;G\u00fcney Grubu M\u00fcd\u00fcr\u00fc&quot;);\r\n\r\n            \/\/M\u00fcd\u00fcrlere b\u00f6lgeler ekleniyor\r\n            director1.AddPersonnel(area2);\r\n            director2.AddPersonnel(area1);\r\n\r\n            \/\/Genel m\u00fcd\u00fcr tan\u0131mlan\u0131yor\r\n            GeneralDirectorate generalDirectorate = new(&quot;Genel M\u00fcd\u00fcr&quot;);\r\n\r\n            \/\/Genel m\u00fcd\u00fcre m\u00fcd\u00fcrler ekleniyor\r\n            generalDirectorate.AddPersonnel(director1);\r\n            generalDirectorate.AddPersonnel(director2);\r\n\r\n            generalDirectorate.ComputeSalary();\r\n        }\r\n<\/pre>\n<\/div>\n<p>Sonu\u00e7 :<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/11\/C-Composite-Design-PatternComposite-Tasarim-Deseni-3.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/11\/C-Composite-Design-PatternComposite-Tasarim-Deseni-3.jpg\" alt=\"C# Composite Design Pattern(Composite Tasar\u0131m Deseni)\" width=\"333\" height=\"382\" class=\"aligncenter size-full wp-image-23623\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/11\/C-Composite-Design-PatternComposite-Tasarim-Deseni-3.jpg 333w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/11\/C-Composite-Design-PatternComposite-Tasarim-Deseni-3-262x300.jpg 262w\" sizes=\"auto, (max-width: 333px) 100vw, 333px\" \/><\/a>\n<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u0130yi \u00e7al\u0131\u015fmalar&#8230;<br \/>\n<!--nextpage--><\/p>\n<table>\n<thead>\n<tr>\n<th style=\"color:red;\">SENARYO 6<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"color:#EEF2F5;background-color:gray;font-size:13px;\">\nBir c\u00fcmle, kelimelerden; kelime ise harflerden meydana gelmektedir. Haliyle b\u00f6yle bir metinsel d\u00fczeni Composite pattern ile ger\u00e7ekle\u015ftirelim.\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<table>\n<thead>\n<tr>\n<th style=\"color:red;\">\u00c7\u00d6Z\u00dcM<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size:13px;text-align:left;\">\n<ul>\n<li><em><strong>Ad\u0131m 1<\/strong> <span style=\"color:green;\">(Component Soyut S\u0131n\u0131f\u0131n\u0131n Tasarlanmas\u0131)<\/span><\/em><br \/>\nBir metni ifade edecek olan; c\u00fcmle, kelime ve harf diziliminin ortak yap\u0131lanmas\u0131 olan <em>Component<\/em> aray\u00fcz\u00fc a\u015fa\u011f\u0131daki gibi olacakt\u0131r.<\/p>\n<div style=\"width:690px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Component\r\n    abstract class Text\r\n    {\r\n        public abstract void PrintThisBefore();\r\n        public abstract void PrintThisAfter();\r\n        public virtual void Print()\r\n        {\r\n            PrintThisBefore();\r\n            PrintThisAfter();\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<p>Burada dikkat ederseniz &#8216;PrintThisBefore&#8217; ve &#8216;PrintThisAfter&#8217; metotlar\u0131 mevcuttur. Bu metotlar ile ilgili s\u00f6z \u00f6\u011fesinin \u00f6ncesi ve sonras\u0131 durumlar\u0131na g\u00f6re <em>Composite<\/em> ve <em>Leaf<\/em> s\u0131n\u0131flar\u0131nda gerekli i\u015faretlemelerde bulunuyor olaca\u011f\u0131z. Misal olarak; kelimelerden \u00f6nce bo\u015flu\u011fun gelmesi ya da c\u00fcmlelerin sonunda nokta gelmesi gibi&#8230;<\/p>\n<div style=\"width:690px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Component\r\n    abstract class TextComposite : Text\r\n    {\r\n        protected List&lt;Text&gt; _texts = new();\r\n        public void AddText(Text text)\r\n            =&gt; _texts.Add(text);\r\n        public void RemoveText(Text text)\r\n            =&gt; _texts.Remove(text);\r\n        public override void Print()\r\n        {\r\n            PrintThisBefore();\r\n            foreach (Text text in _texts)\r\n                text.Print();\r\n            PrintThisAfter();\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<\/li>\n<li><em><strong>Ad\u0131m 2<\/strong> <span style=\"color:green;\">(Composite S\u0131n\u0131f\u0131n\u0131n Tasarlanmas\u0131)<\/span><\/em><br \/>\nBir metin yap\u0131lanmas\u0131nda kelimeler ve c\u00fcmleler olmak \u00fczere iki adet <em>Composite<\/em> s\u0131n\u0131f bulunmaktad\u0131r. \u015eimdi gelin bu iki s\u0131n\u0131f\u0131 s\u0131ras\u0131yla tasarlayal\u0131m;<\/p>\n<div style=\"width:690px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Composite\r\n    class Word : TextComposite\r\n    {\r\n        public override void PrintThisBefore()\r\n            =&gt; Console.Write(&quot; &quot;);\r\n        public override void PrintThisAfter() { \/* Bo\u015f *\/ }\r\n    }\r\n<\/pre>\n<\/div>\n<p>&#8216;Word&#8217; s\u0131n\u0131f\u0131na g\u00f6z atarsan\u0131z e\u011fer &#8216;PrintThisBefore&#8217; metodunda her kelimeden \u00f6nce gelecek olan bo\u015fluk karakteri yazd\u0131r\u0131lmaktad\u0131r. &#8216;PrintThisAfter&#8217; metodunda ise, her kelimeden sonra bo\u015fluk ya da nokta gelebilme ihtimali oldu\u011fu i\u00e7in herhangi bir i\u015flem ger\u00e7ekle\u015ftirilmemektedir.<\/p>\n<div style=\"width:690px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Composite\r\n    class Sentence : TextComposite\r\n    {\r\n        public override void PrintThisBefore() { \/* Bo\u015f *\/ }\r\n        public override void PrintThisAfter()\r\n            =&gt; Console.Write(&quot;.&quot;);\r\n    }\r\n<\/pre>\n<\/div>\n<p>Benzer mant\u0131kla yukar\u0131daki &#8216;Sentence&#8217; s\u0131n\u0131f\u0131nda ise &#8216;PrinThisBefore&#8217; metodu bo\u015f ge\u00e7ilmi\u015f lakin &#8216;PrinThisAfter&#8217; metodunda ise her c\u00fcmle sonunda nokta gelece\u011fi ifade edilmi\u015ftir.\n<\/li>\n<li><em><strong>Ad\u0131m 3<\/strong> <span style=\"color:green;\">(Leaf S\u0131n\u0131f\u0131n\u0131n Tasarlanmas\u0131)<\/span><\/em><br \/>\nMetin dizelerinde <em>Leaf<\/em> olarak tasarlanabilecek tek yap\u0131 harflerdir. Haliyle hemen ilgili s\u0131n\u0131f tasar\u0131m\u0131n\u0131 ger\u00e7ekle\u015ftirelim;<\/p>\n<div style=\"width:690px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Leaf\r\n    class Letter : Text\r\n    {\r\n        char _character;\r\n\r\n        public Letter(char character)\r\n        {\r\n            _character = character;\r\n        }\r\n        public override void PrintThisBefore()\r\n            =&gt; Console.Write(_character);\r\n        public override void PrintThisAfter() { \/* Bo\u015f *\/ }\r\n    }\r\n<\/pre>\n<\/div>\n<p>&#8216;Letter&#8217; s\u0131n\u0131f\u0131na g\u00f6z atarsan\u0131z e\u011fer bir &#8216;char&#8217; t\u00fcr\u00fcnden karakter almakta ve &#8216;PrinThisBefore&#8217; metodunda bu karakteri ekrana yazd\u0131rmaktad\u0131r.\n<\/li>\n<li><em><strong>Ad\u0131m 4<\/strong> <span style=\"color:green;\">(Test)<\/span><\/em><br \/>\nYap\u0131lan bu in\u015fay\u0131 a\u015fa\u011f\u0131daki \u00f6rnek \u00e7al\u0131\u015fmayla test edersek e\u011fer;<\/p>\n<div style=\"width:690px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            Word word1 = new();\r\n            word1.AddText(new Letter('M'));\r\n            word1.AddText(new Letter('e'));\r\n            word1.AddText(new Letter('r'));\r\n            word1.AddText(new Letter('h'));\r\n            word1.AddText(new Letter('a'));\r\n            word1.AddText(new Letter('b'));\r\n            word1.AddText(new Letter('a'));\r\n\r\n            Word word2 = new();\r\n            word2.AddText(new Letter('D'));\r\n            word2.AddText(new Letter('\u00fc'));\r\n            word2.AddText(new Letter('n'));\r\n            word2.AddText(new Letter('y'));\r\n            word2.AddText(new Letter('a'));\r\n\r\n            Sentence sentence = new();\r\n            sentence.AddText(word1);\r\n            sentence.AddText(word2);\r\n\r\n            sentence.Print();\r\n        }\r\n<\/pre>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/11\/C-Composite-Design-PatternComposite-Tasarim-Deseni-4.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/11\/C-Composite-Design-PatternComposite-Tasarim-Deseni-4.jpg\" alt=\"C# Composite Design Pattern(Composite Tasar\u0131m Deseni)\" width=\"126\" height=\"20\" class=\"aligncenter size-full wp-image-23626\" \/><\/a>ekran \u00e7\u0131kt\u0131s\u0131n\u0131 alaca\u011f\u0131z.<\/p>\n<p>Haliyle g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere Composite pattern mant\u0131\u011f\u0131yla harflerden kelimeler, kelimelerden de c\u00fcmleler olu\u015fturmu\u015f bulunmaktay\u0131z \ud83d\ude42\n<\/p><\/div>\n<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\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, Bu i\u00e7eri\u011fimizde Yap\u0131sal Tasar\u0131m Kal\u0131plar\u0131ndan(Structural Patterns) olan Composite Tasar\u0131m Desenini(Composite Design Pattern) tam teferruatl\u0131 inceleyecek ve bol bol \u00f6rnekler ile zihinlerimize mant\u0131ksal yap\u0131s\u0131n\u0131 kaz\u0131maya \u00e7al\u0131\u015faca\u011f\u0131z. O halde fazla vakit kaybetmeksizin buyrun ba\u015flayal\u0131m&#8230; Ba\u015flarken&#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":23497,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2739,153],"tags":[4434,4433,4432,4430,4431],"class_list":["post-23449","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-core","category-design-pattern","tag-c-composite-d-p","tag-c-composite-design-pattern","tag-composite","tag-composite-design-pattern","tag-composite-tasarim-deseni"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/23449","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=23449"}],"version-history":[{"count":160,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/23449\/revisions"}],"predecessor-version":[{"id":23627,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/23449\/revisions\/23627"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/23497"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=23449"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=23449"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=23449"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}