﻿
{"id":4000,"date":"2016-04-13T14:28:11","date_gmt":"2016-04-13T14:28:11","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=4000"},"modified":"2016-04-13T14:28:11","modified_gmt":"2016-04-13T14:28:11","slug":"c-observer-design-patternobserver-tasarim-deseni","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-observer-design-patternobserver-tasarim-deseni\/","title":{"rendered":"C# Observer Design Pattern(Observer Tasar\u0131m Deseni)"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu yaz\u0131m\u0131zda Behavioral Patterns(Davran\u0131\u015fsal Kal\u0131plar) kategorisine giren Observer Design Pattern \u00fczerine konu\u015faca\u011f\u0131z.<\/p>\n<p>Observer ad\u0131 \u00fczerinde g\u00f6zlemci, izleyici, g\u00f6zc\u00fc yahut g\u00f6zetmen diye nitelendirilen, anlam\u0131 gibi i\u015flev g\u00f6ren bir tasar\u0131m desenidir. Elimizdeki mevcut nesnenin durumunda herhangi bir de\u011fi\u015fiklik oldu\u011funda, bu de\u011fi\u015fiklerden di\u011fer nesneleri haberdar eden bir tasar\u0131mdan bahsediyoruz. Dahada net bir \u015fekilde bahsetmek gerekirse, elimizdeki &#8220;x&#8221; nesnesinin &#8220;y&#8221; \u00f6zelli\u011finde bir g\u00fcncellenme, de\u011fi\u015fiklik yahut belirli bir \u015fart\u0131n ger\u00e7ekle\u015fmesi gibi bir durum cereyan etti\u011finde bu &#8220;x&#8221; nesnesini -izleyen- -g\u00f6zleyen- di\u011fer &#8220;z&#8221;, &#8220;w&#8221;, &#8220;k&#8221; vs. nesnelerine bu yeni durumu bildiren sisteme Observer tasar\u0131m deseni diyoruz.<\/p>\n<p>\u015eimdi Observer Design Pattern i\u00e7in teorik olarak \u00f6rnek olay ele alal\u0131m.<\/p>\n<blockquote><p><em>Elimizde bir \u00d6\u011frenci nesnesi olsun. Bu \u00d6\u011frenciyi takip eden; Anne, Baba ve \u00d6\u011fretmen nesneleri olsun. Okul, \u00d6\u011frenci dersi ast\u0131\u011f\u0131 zaman onu takip eden Annesine, Babas\u0131na ve \u00d6\u011fretmenine direkt olarak bu durumu haber veriyor olsun.<\/em><\/p><\/blockquote>\n<p>\u0130\u015fte bu yukar\u0131da g\u00f6rd\u00fc\u011f\u00fcn\u00fcz \u00f6rnek olay tam tam\u0131na Observer tasar\u0131m desenine uygun bir \u00f6rnektir. \u0130nternet ve di\u011fer kaynaklara g\u00f6z atarsan\u0131z e\u011fer konuyla alakal\u0131 &#8220;Subject&#8221;, &#8220;Observer&#8221; ve &#8220;Concrete&#8221; terimleriyle kar\u015f\u0131la\u015facaks\u0131n\u0131z. \u015eimdi bu terimlerimizi yukar\u0131daki \u00f6rnek olay \u00fczerinden ili\u015fki kurarak a\u00e7\u0131klayal\u0131m ve bu esnada Observer Design Pattern&#8217;in \u00f6rnek olay\u0131m\u0131zdaki rol\u00fcn\u00fc tam olarak net bir \u015fekilde izah edelim.<\/p>\n<p>Observer Design Pattern&#8217;de;<\/p>\n<ul>\n<li><strong><em>Subject<\/em><\/strong><br \/>\nTakip edilecek nesneyi Subject terimiyle ifade etmekteyiz. Yukar\u0131daki \u00f6rnek olayda \u00d6\u011frenci nesnesi bizim Subject&#8217;timiz olmaktad\u0131r.<\/li>\n<li><strong><em>Observer<\/em><\/strong><br \/>\nSubject&#8217;i takip edecek olan aboneler tek tip olmayabilirler. Yukar\u0131daki \u00f6rnek olay\u0131m\u0131zda Subject&#8217;i, hem Ana, hem Baba hemde \u00d6\u011fretmen nesneleri takip etmektedirler. \u0130\u015fte b\u00f6yle bir durumda birden fazla tipe aray\u00fcz g\u00f6revi g\u00f6recek abstract yahut interface yap\u0131m\u0131za Observer denmektedir. Anlayaca\u011f\u0131n\u0131z \u00f6rnek olay\u0131m\u0131zda \u00d6\u011frenci nesnemizi takip edenlerin birden fazla tip olmas\u0131n\u0131 sa\u011flayan o sistem Observer aray\u00fcz\u00fcd\u00fcr. <\/li>\n<li><strong><em>Concrete<\/em><\/strong><br \/>\nSubject&#8217;i takip eden nesnelerdir. Yukar\u0131daki \u00f6rnek olay\u0131m\u0131zda; Anne, Baba ve \u00d6\u011fretmen nesneleri Concrete nesneleridir.\n        <\/li>\n<\/ul>\n<p>\u0130\u015fte Observer Design Pattern yap\u0131s\u0131n\u0131da \u00d6\u011frencinin dersi asd\u0131\u011f\u0131 anda di\u011fer abonelere haber veren Okul&#8217;a benzetebiliriz. Yani bir sistemdir diyebiliriz.<\/p>\n<p>\u015eimdi teknik olarak Observer Design Pattern&#8217;i incelemeye ba\u015flayabiliriz.<br \/>\n\u00d6ncelikle UML Diagram\u0131na bir g\u00f6z atal\u0131m.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/c-observer-design-patternobserver-tasarim-deseni\/c-observer-design-patternobserver-tasarim-deseni\/\" rel=\"attachment wp-att-4010\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/C-Observer-Design-PatternObserver-Tasar\u0131m-Deseni.png\" alt=\"C# Observer Design Pattern(Observer Tasar\u0131m Deseni)\" width=\"348\" height=\"277\" class=\"aligncenter size-full wp-image-4010\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/C-Observer-Design-PatternObserver-Tasar\u0131m-Deseni.png 348w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/C-Observer-Design-PatternObserver-Tasar\u0131m-Deseni-300x239.png 300w\" sizes=\"auto, (max-width: 348px) 100vw, 348px\" \/><\/a><\/p>\n<p>Diyagramda g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi Subject(Hedef) olarak belirtilen nesnemize Observer&#8217;lar(G\u00f6zlemciler) subscribe yani abone olmu\u015flard\u0131r. Subject nesnemiz i\u00e7erisinde herhangi bir &#8220;y&#8221; \u00f6zelli\u011fi g\u00fcncellendi\u011finde Notify metodu tetiklenecek ve bu metod Subject&#8217;e abone olan t\u00fcm Observer&#8217;lar\u0131n Update metodunu \u00e7al\u0131\u015ft\u0131racakt\u0131r.<\/p>\n<p>Hadi gelin bu diyagram mant\u0131\u011f\u0131nda yukar\u0131daki \u00f6rnek olay\u0131 pratikle\u015ftirelim.<\/p>\n<p>\u00d6ncelikle Subject&#8217;imize(yani hedefimize) bir \u00e7ok tipin abone olabilmesini sa\u011flayacak Observer aray\u00fcz\u00fcn\u00fc geli\u015ftirelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n\tabstract public class Observer\r\n\t{\r\n\t\tpublic abstract void Update();\r\n\t}\r\n<\/pre>\n<p>Observer aray\u00fcz\u00fcn\u00fc ben abstract class olarak belirledim. Siz isterseniz interface olarak \u00e7al\u0131\u015fabilirsiniz. Observer s\u0131n\u0131f\u0131ndan kal\u0131t\u0131m alan her abone s\u0131n\u0131fa Update metodu uygulanacakt\u0131r. Haliyle Subject&#8217;imizde ilgili alan de\u011fi\u015fti\u011finde abonelerimizdeki Update metodu tetiklenecektir.<\/p>\n<p>\u015eimdi Concrete nesnelerimizi ba\u015fka bir deyi\u015fle takip edecek s\u0131n\u0131flar\u0131m\u0131z\u0131 olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n\tpublic class BabaObserver: Observer\r\n\t{\r\n\t\tpublic override void Update()\r\n\t\t{\r\n\t\t\tConsole.WriteLine(&quot;\u00d6\u011frencinin ka\u00e7t\u0131\u011f\u0131ndan babas\u0131n\u0131n haberi oldu.&quot;);\r\n\t\t}\r\n\t}\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n\tpublic class AnneObserver: Observer\r\n\t{\r\n\t\tpublic override void Update()\r\n\t\t{\r\n\t\t\tConsole.WriteLine(&quot;\u00d6\u011frencinin ka\u00e7t\u0131\u011f\u0131ndan anas\u0131n\u0131n haberi oldu.&quot;);\r\n\t\t}\r\n\t}\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n\tpublic class OgretmenObserver: Observer\r\n\t{\r\n\t\tpublic override void Update()\r\n\t\t{\r\n\t\t\tConsole.WriteLine(&quot;\u00d6\u011frencinin ka\u00e7t\u0131\u011f\u0131ndan \u00f6\u011fretmenin haberi oldu.&quot;);\r\n\t\t}\r\n\t}\r\n<\/pre>\n<p>Tabi bu s\u0131n\u0131flara kendilerine \u00f6zg\u00fc i\u015flev yapacak ba\u015fka elemanlar eklenebilirler. Lakin biz makalemizde \u00f6ze olan e\u011filimimizden dolay\u0131 sade bir \u00f6rneklendirme \u00fczerinden gidiyoruz.<\/p>\n<p>\u015eimdide Subject&#8217;imizi yani takip edilecek nesnemizi in\u015fa edelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n\tpublic class Ogrenci\r\n\t{\r\n\t\tpublic string Adi { get; set; }\r\n\t\tpublic string SoyAdi { get; set; }\r\n\t\tpublic string Memleket { get; set; }\r\n\t\tpublic int Sinif { get; set; }\r\n\t\t\r\n\t\tbool dersiAstiMi;\r\n\t\t\/\/Bu property Observer D. P.'de de\u011feri kontrol edilen \u00f6zelli\u011fimizdir.\r\n\t\t\/\/set blo\u011funa dikkat edersek e\u011fer set edilen de\u011fer true ise\r\n\t\t\/\/Notify metodu tetiklenmekte ve t\u00fcm abonelere haber g\u00f6nderilmektedir.\r\n\t\tpublic bool DersiAstiMi {\r\n\t\t\tget { return dersiAstiMi; }\r\n\t\t\tset {\r\n\t\t\t\tif (value = true) {\r\n\t\t\t\t\tNotify();\r\n\t\t\t\t\tdersiAstiMi = value;\r\n\t\t\t\t}else\r\n\t\t\t\t\tdersiAstiMi = value;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\/\/Subject nesnesi kendisine abone olan g\u00f6zlemcileri bu koleksiyonda tutacakt\u0131r.\r\n\t\tList&lt;Observer&gt; Gozlemciler ;\r\n\t\tpublic Ogrenci()\r\n\t\t{\r\n\t\t\tthis.Gozlemciler = new List&lt;Observer&gt;();\r\n\t\t}\r\n\t\t\/\/G\u00f6zlemci ekle\r\n\t\tpublic void AboneEkle(Observer observer){\r\n\t\t\tGozlemciler.Add(observer);\r\n\t\t}\r\n\t\t\/\/G\u00f6zlemci \u00e7\u0131kar\r\n\t\tpublic void AboneCikar(Observer observer){\r\n\t\t\tGozlemciler.Remove(observer);\r\n\t\t}\r\n\t\t\/\/Herhangi bir g\u00fcncelleme olursa ilgili g\u00f6zlemcilere haber verecek metodumuzdur.\r\n\t\tpublic void Notify(){\r\n\t\t\tGozlemciler.ForEach(g=&gt;\r\n\t\t\t                    {\r\n\t\t\t                    \tg.Update();\r\n\t\t\t                    });\r\n\t\t}\r\n\t}\r\n<\/pre>\n<p>Ve son olarak tasar\u0131m\u0131m\u0131z\u0131 test edelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n\tclass Program\r\n\t{\r\n\t\tpublic static void Main(string&#x5B;] args)\r\n\t\t{\r\n\t\t\t\r\n\t\t\tOgrenci o = new Ogrenci();\r\n\t\t\to.AboneEkle(new BabaObserver());\r\n\t\t\to.AboneEkle(new AnneObserver());\r\n\t\t\to.AboneEkle(new OgretmenObserver());\r\n\t\t\t\r\n\t\t\to.Adi = &quot;Gen\u00e7ay&quot;;\r\n\t\t\to.SoyAdi = &quot;Y\u0131ld\u0131z&quot;;\r\n\t\t\to.Memleket = &quot;Artvin&quot;;\r\n\t\t\to.Sinif = 24;\r\n\t\t\to.DersiAstiMi = true;\r\n\t\t\t\r\n\t\t\tConsole.ReadKey(true);\r\n\t\t}\r\n\t}\r\n<\/pre>\n<p>DersiAstiMi propertysine &#8220;true&#8221; de\u011ferini set etti\u011fi sat\u0131rdan sonra a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcndeki sonucu almaktay\u0131z.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/c-observer-design-patternobserver-tasarim-deseni\/c-observer-design-patternobserver-tasarim-deseni-2\/\" rel=\"attachment wp-att-4017\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/C-Observer-Design-PatternObserver-Tasar\u0131m-Deseni-1.png\" alt=\"C# Observer Design Pattern(Observer Tasar\u0131m Deseni)\" width=\"383\" height=\"99\" class=\"aligncenter size-full wp-image-4017\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/C-Observer-Design-PatternObserver-Tasar\u0131m-Deseni-1.png 383w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/C-Observer-Design-PatternObserver-Tasar\u0131m-Deseni-1-300x78.png 300w\" sizes=\"auto, (max-width: 383px) 100vw, 383px\" \/><\/a><\/p>\n<p>Bir Design Pattern makalesininde sonuna gelmi\u015f bulunmaktay\u0131z. Konumuzu noktalamadan \u00f6nce <a href=\"http:\/\/www.gencayyildiz.com\/blog\/cta-delegatetemsilci-ve-eventolay-kullanimi\/\" target=\"_blank\">delegate &#8211; event<\/a> yap\u0131lar\u0131 aras\u0131ndaki ili\u015fki ile Observer tasar\u0131m \u015fablonundaki subject ve aboneler aras\u0131ndaki ili\u015fkilerin ne kadar paralel mant\u0131kta oldu\u011funu vurgulamak istiyorum. <\/p>\n<p>Okudu\u011funuz i\u00e7in te\u015fekk\u00fcr ederim&#8230;<\/p>\n<p>Sonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<\/p>\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 yaz\u0131m\u0131zda Behavioral Patterns(Davran\u0131\u015fsal Kal\u0131plar) kategorisine giren Observer Design Pattern \u00fczerine konu\u015faca\u011f\u0131z. Observer ad\u0131 \u00fczerinde g\u00f6zlemci, izleyici, g\u00f6zc\u00fc yahut g\u00f6zetmen diye nitelendirilen, anlam\u0131 gibi i\u015flev g\u00f6ren bir tasar\u0131m desenidir. Elimizdeki mevcut nesnenin durumunda&#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":4010,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[153],"tags":[1067,1066,1064,1062,1063,1065],"class_list":["post-4000","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-design-pattern","tag-behavioral-patternsdavranissal-kaliplar","tag-concrete","tag-observer","tag-observer-design-pattern","tag-observer-tasarim-deseni","tag-subject"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4000","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=4000"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4000\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/4010"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=4000"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=4000"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=4000"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}