• Anasayfa
  • Hakkımızda
  • Etkinlikler
  • Destek Verin
  • Site Haritası
  • Giriş Yap
  • Üye Ol
  • Facebook
  • Twitter
  • RSS
Yazılım Dilleri
  • Soru - Cevap
  • EĞİTİM SETİ
  • KATEGORİ
  • DUYURU
  • TEKNOLOJİ HABERLERİ

Son Sorular

  • 23.04.2016 00:55:33C programlama 2 oyun
  • 20.04.2016 16:34:41Local Database
  • 15.04.2016 14:26:15Fatura kayıt işlemi
  • 21.03.2016 01:55:30C# problem

Popüler Sorular

  • 27.05.2012 05:49:50Asp.Net ile Date time alana veri ekleyemiiyorum ?
  • 2.04.2012 00:45:18.exe uzantılı dosya için dijital imza nerde nasıl alınır.
  • 12.05.2012 08:44:49Acil Yardım
  • 27.05.2012 13:46:51veri tabanı bağlantısı
  • .Net Framework
  • 8085 Assembly
  • Active Directory
  • ADO.NET
  • Android
  • Apple IOS
  • Arduino
  • ASP.NET
  • ASP.NET MVC
  • Blackberry
  • C#.Net
  • C++
  • CCG Framework
  • CISCO
  • CSS
  • Diğer
  • Dreamweaver
  • Entity Framework
  • Exchange Server
  • Gömülü Sistemler
  • GSM Programlama
  • Güncel
  • Güvenlik
  • HTML5
  • Java
  • Javascript / JQuery
  • Jira
  • Kariyer ve İş Yaşamı
  • LINQ
  • LibreOffice
  • Linux
  • Matlab
  • Microsoft Dynamics CRM
  • Mobil Uygulama Geliştirme
  • MySQL
  • NoSQL
  • Oracle
  • OWIN
  • PFSense
  • PHP
  • Powershell
  • Python
  • Sanallastirma
  • SAP-ABAP
  • SCOM 2012
  • SEO
  • Sharepoint 2010
  • Sharepoint 2013
  • Silverlight
  • Sistem Analiz ve Tasarımı
  • SQL Server
  • Symantec
  • TFS
  • T-SQL
  • Ubuntu
  • VB.NET
  • Veritabanı Yönetim Sistemleri
  • Visual Studio
  • VMware
  • WCF
  • Web Hosting
  • Windows 8
  • Windows Azure
  • Windows Phone 7.1
  • Windows Phone 8
  • Windows Server
  • Wordpress
  • WPF
  • Xamarin
  • XNA
  • Yazılım Mühendisliği
  • Yöneylem Araştırması
  • ASP.NET MVC
  • Entity Framework
  • Javascript / JQuery
  • LINQ
  • PHP

Son Duyurular

IPhone 6 ve IPhone 6 Plus Teknik Özellikleri ve Fiyatı

IPhone 6 ve IPhone 6 Plus Teknik Özellikleri ve Fiyatı

DELL'in Yeni Projesi: USB Bilgisayar (Project Ophelia)

DELL'in Yeni Projesi: USB Bilgisayar (Project Ophelia)

Windows Phone Youtube Uygulaması Google ve Microsoft ile Yeniden Yapılıyor

Windows Phone Youtube Uygulaması Google ve Microsoft ile Yeniden Yapılıyor

Android ve Apple IOS Telefonlar için Blackberry Messenger (BBM)

Android ve Apple IOS Telefonlar için Blackberry Messenger (BBM)

Nokia Lumia 925 Teknik Özellikleri, Lumia 928 ve 920 ile Karşılaştırması

Nokia Lumia 925 Teknik Özellikleri, Lumia 928 ve 920 ile Karşılaştırması

LG Optimus G Pro Özellikleri ve Gözle Video Oynatma Teknolojisi

LG Optimus G Pro Özellikleri ve Gözle Video Oynatma Teknolojisi

Tasarım Desenleri - Observer

Observer design pattern nedir? Ne işe yarar? Nerelerde kullanılır?

15.08.2012

Yazar: Burak Selim Şenyurt (Google+)

Kategori: Yazılım Mühendisliği

2983

 

Merhaba Arkadaşlar,

Yaklaşık olarak 10 yılı aşkın bir süredir yazılım teknolojileri ile ilgilenmekteyim. Bu süre zarfı içerisinde Delphi 1.0' dan tutunda Java' ya, C++'tan C#' a, Visual Basic' ten Cobol' a kadar pek çok programlama dili ile uğraşma fırsatım oldu. Her ne kadar dünyada kaç nesne yönelimli programlama dili olursa olsun, hayatın ve dolayısıyla yazılım teknolojilerinin değişmez kuralları arasında tasarım kalıpları yer almakta...

Ve birde platform, dil, cihaz gözetmeksizin var olan oyunlar. Laughing

Bende her ne kadar yazılımı bir hayat biçimi olarak benimsemiş olsamda, zaman zaman eski günlerdeki gibi strateji oyunlarını oynamıyor da değilim. Warcraft 2 ve "Yeş mi Lord" ile başlayan bu serüvende, Starcraft' taki Protosları, Red Alert' taki Yuri' nin Mind Control makinelerini,Generals' taki Stealth Fighter' ları ve daha nicelerini kullanma fırsatım oldu. Geçen akşamda kafamda bir oyun canlandırmaya çalışırken, korumakta olduğum topraklara yapılan bir saldırıyı, filomdaki birimlere nasıl ileteceğimi düşünmeye başladım.(Çok doğal olarak telsizle bildir olsun bitsin diyebilirsiniz) Bir saldırı anında tank, helikopter, yaya piyade veya deniz gücündeki operatörlere bu durumun iletilmesi gerekiyordu. Aslında birilerininde sürekli olarak dinlemede olması şarttı. Aslında bu birimlerin hepsi oyun sahası içerisinde yer alan birer nesne idi ve OOP tarafında tip olarak modellenebilirlerdi. Dolayısıyla aralarında bire-çok(one to many) ilişki olabilecek nesnelerin olması ve birisinde meydana gelecek değişikliklerin diğerlerine bildirilmesi gibi senaryo ortaya çıkmaktaydı.(Bir filonun komuta merkezinden, ona bağlı tüm birimlere haber gitmesi durumu)

Duruma farklı senaryolardan da bakabiliriz aslında. Örneğin,

  • bir stok takip sisteminde, stok hareketlerinde olan değişimlerin bayilere bildirimesi,
  • haber ajanslarının, kendilerine bağlı olan bölümlere yeni başlıklar geldikçe bilgilendirmede bulunmaları,

gibi gerçek hayat senaryoları söz konusu olabilir.

Tahmin edeceğini üzere varmakta olduğumuz nokta bu 3 basit senaryoda benzer vakanın ve ihtiyaçların olmasıdır. Buda bizi bir tasarım kalıbına götürmektedir. Observer tasarım deseni. Wink Bu desen o kadar yaygındır ki onu;

  • Model View Controller(MVC) içerisinde
  • veya .Net ile Java tarafındaki olay güdümlü programlamada(Event Based Programming)

bulabiliriz.

Aslında bu desen servis yönelimli mimarilerde dahi karşımıza çıkmaktadır. Özetle çok sık kullanılan bir kalıp olduğunu ifade edebiliriz. Desenin ilkesi az öncede belirttiğimiz üzere birbirlerine bire-çok ilişki ile bağlı nesnelerde olabilecek değişiklikleri diğerlerine iletmektir. Bu nedenle izlenmeye değer bir konu ve bununla ilişkili nesneler(Subject, ConcreteSubject) söz konusudur. Ayrıca konuyu takip edecek olan tiplerde(Observer, ConcreteObserver) bulunmaktadır.

 

Dilerseniz konumuza basit bir örnek ile devam edelim. Yazımıza giriş kısmında bahsettiğimiz askeri strateji bazlı senaryoyu bu bağlamda göz önüne alabiliriz. Senaryomuza göre konumuz, bir saldırı veya benzer durumlarda, istediğimiz bazı birliklerin operatörlerinin bilgilendirilmesidir. Burada bilgilendirmeyi yapacak olan yayımcılar(Publishers) ve bunu dinleyecek olanaboneler(Subscribers) olduğunuda düşünebiliriz aslında. Aslında Observer deseni bir anlamda publisher/subscriber modelinin bir uygulanış biçimi olarakta düşünülebilir. İşte sınıf diagramımız ve kodlarımız.

 

(Bu arada sınıf diagramı biraz farklı görünebilir. Nitekim şu anda bu yazıyı kayınvalidemin bilgisayarında yazmaktayım. Makine Visual Studio yok belki ama SharpDevelop sağolsun her ihtiyacımı görüyor. Wink )

Ve kodlarımız;

using System;
using System.Collections.Generic;

namespace Observer
{
    /// <summary>
    /// Subject class
    /// </summary>
    internal abstract class HeadQuarters
    {
        private string _information;
        private List<IOperator> _operators=null;

        protected HeadQuarters(string information)
        {
            _operators = new List<IOperator>();
            Information = information;
        }

        public string Information
        {
            get { return _information; }
            set { 
                _information = value; 
                NotifyOperators();
            }
        }

        public void AddOperator(IOperator opt)
        {
            _operators.Add(opt);
        }
        public void RemoveOperator(IOperator opt)
        {
            _operators.Remove(opt);
        }
        public void NotifyOperators()
        {
            foreach (IOperator opt in _operators)
            {
                opt.Update(this);
            }
        }
    }

    /// <summary>
    /// Concrete Subject class
    /// </summary>
    internal class RedFleetBase
        :HeadQuarters
    {
        public RedFleetBase(string information)
           :base(information)
        {
            
        }

        public RedFleetBase()
            :base("...")
        {
            
        }
    }

    /// <summary>
    /// Observer class
    /// </summary>
    internal interface IOperator
    {
        void Update(HeadQuarters headQuarters);
    }

    /// <summary>
    /// Concrete Observer class
    /// </summary>
    internal class PlatoonOperator
        :IOperator
    {
        public string OperatorName { get; set; }

        #region IOperator Members

        public void Update(HeadQuarters headQuarters)
        {
            Console.WriteLine("[{0}] : {1}",OperatorName,headQuarters.Information);
        }

        #endregion
    }

    /// <summary>
    /// Concrete Observer Class
    /// </summary>
    internal class TankOperator
        : IOperator
    {
        public int TankId  { get; set; }
        #region IOperator Members

        public void Update(HeadQuarters headQuarters)
        {
            Console.WriteLine("[{0}] : {1}", TankId, headQuarters.Information);
        }

        #endregion
    }


    /// <summary>
    /// Client App
    /// </summary>
    class Program
    {
        static void Main()
        {
            RedFleetBase redFleetBase = new RedFleetBase {Information = "Süper işlemciler piyasada"};
            redFleetBase.Information = "İşlemciler gelişiyor";

            redFleetBase.AddOperator(new PlatoonOperator { OperatorName="Azman"} );
            redFleetBase.AddOperator(new PlatoonOperator { OperatorName = "Kara Şahin"});
            redFleetBase.AddOperator(new PlatoonOperator { OperatorName="Kartal Kondu"});

            redFleetBase.Information = "Tüm birlikler Sarı Alarma! Sarı Alarma!";

            Console.WriteLine("");

            redFleetBase.Information = "Emir iptal! Emir iptal!";

            Console.WriteLine("");

            redFleetBase.AddOperator(new TankOperator{TankId=701});
            redFleetBase.AddOperator(new TankOperator{TankId=801});
            redFleetBase.Information = "Sınır ihlali.";
        }
    }
}

Biraz kodları incelemekte fayda olduğu kanısındayım...

Subject tipimiz olan HeadQuarters, Information isimli bir özelliğe sahiptir. Bu özellik, Observertiplerinin değerlendireceği bir bilgidir. Bir başka deyişle, HeadQuarters' tan, IOperator türevlerine aktarılan bildirimdir. HeadQuarters abstract tipi içerisinde bilgilendirilme yapılacak IOperatortürevleride bir koleksiyon içerisinde saklanmaktadır. Buna göre, HeadQuarters içerisindekiInformation özelliğinde yapılacak bir değişilik sonrası devreye giren Set bloğundan,NotifyOperators isimli metod çağırılmaktadır. Dikkat edileceği üzere söz konusu metod,IOperator tipinden olan List koleksiyonundaki tüm türevlerin Update metodunu çağırmakta ve çalışma zamanındaki HeadQuarters nesne referansını alt sınıflara göndermektedir. Dolayısıyla, bilgilendirme yaplılacak IOperator türevlerinin söz konusu Subject tipi içerisinde saklanması için ekleme ve çıkarma operasyonları da HeadQuarters sınıfına dahil edilmiştir.

Tabiki istemcinin(Console uygulamamız) asıl kullanacağı tip Subject' ten türeyenConcreteSubject sınıfıdır(RedFleetBase). İstemci, bu tip üzerinde abonelerini bildirmektedir. YaniIOperator(Observer) arayüzünü implemente eden PlatoonOperator ve TankOperator nesne örneklerini...Kodun içerisinde RedFleetBase nesne örneği üzerinden yapılan her bir Informationdeğişikliği sonrası, ne kadar tank ve piyade operatörü varsa bilgilendirilmektedir. Aynen aşağıdaki örnek çalışma zamanı çıktısında olduğu gibi.

Modelde dikkat edilmesi gereken noktalardan biriside, Subject ve Observer tiplerinden istenildiği kadar türetme yapılabilmesi ve bunların aralarında kuvvetli bir bağ ilişkisi olmamasıdır. Burada Subject tipinin kendi içerisinde soyut bir Observer tip koleksiyonu kullanmasınında büyük bir anlamı vardır. Böylece geldik bir tasarım kalıbımızın daha sonuna. Tekrardan görüşünceye dek hepinize mutlu günler dilerim.

Görsel anlatımları için NedirTV? adreslerini kullanabilirsiniz.

Observer.rar (29,47 kb)

Yazar Hakkında

Burak Selim Şenyurt

Burak Selim Şenyurt

buraksenyurt.com

Yıldız Teknik Üniversitesi Matematik Mühendisliği mezunu olan Şenyurt, 1999 yılında profesyonel olarak adım attığı yazılım dünyasında, 2003 yılından beri Microsoft .Net teknolojileri ile ilgilenmektedir. Yazılım hayatına Assist Line isimli Call Center firmasında Delphi programcısı olarak başlayan Şenyurt sonrasında, sırasıyla Bizitek(Junior Developer), Netron(Master Trainer), Citibank(Outsource Senior Software Developer), Innova(Application Development Consultant), ve TCM(Software Architect) firmalarında görev almıştır. Su anda ING Bank bünyesinde Kıdemli Yazılım Danışmanı olarak görev yapmaktadir. 2006, 2007 yıllarında C#, 2008,2009,2010 yıllarında ise Connected System Developer kategorisinde Microsoft MVP seçilen Şenyurt, evli ve 1 çocuk babasıdır. C# diline olan düşkünlüğü, oğluna S(h)arp adının verilmesinde önemli bir etken olmustur.

Sosyal Medya

ORANLAR

  • 2983izleme

Arkadaşlarınla Paylaş

  • Tweet

0 Yorum

Yorum Yaz / Soru Sor

Lütfen yorum yazmak veya soru sormak için üye girişi yapınız.

Son Yorumlar

  • Hocam Link başka sayfaya yönlendiriyor.
  • merhaba benim merak ettiğim bir konu var y...
  • Merhaba download linki çalışmıyor. Rica et...
  • Nevzat Bey selamlar, Açıkçası bizler a...
  • Parametreleri Cache İşleminden Yalıtma kon...

En Güncel Sorular

  • Bilgilendirme maili (C#.Net)
  • Power Pivot (Sharepoint 2010)
  • BigInteger, BigDecimal (Asp.Net ve Asp.Net MVC)
  • visual C# ile asp nette veritabanı islemleri (Asp.Net ve Asp.Net MVC)
  • Share Point ile Dosya Arşiv Yönetim Sistemi yapılabilir mi ? (Sharepoint 2010)

En Son Cevap Verilen Sorular

  • Bilgilendirme maili
  • BigInteger, BigDecimal
  • visual C# ile asp nette veritabanı islemleri
  • Share Point ile Dosya Arşiv Yönetim Sistemi yapılabilir mi ?
  • txt dosyasına veri yazma

Twitter

Takip et: @yazilim_dilleri

En Çok Okunanlar

Elif BAYRAKDAR

C# ile SQL Server Bağlantısı, Insert, Update ve Delete Sorguları

23.05.2013

  • 120002
  • 0
Hakan Keskin

C# ile Windows Service Projesi Oluşturma, Debug Etme ve Setup Hazırlama

17.12.2013

  • 65045
  • 0
batuhan avlayan

Php - Mail Gönderme (İletişim Formu)

02.09.2013

  • 48254
  • 0

Sponsorlar

KODLAB
Pluralsight
Exchange server is
Office 365
YAZILIM DİLLERİ
Yukarı Çık
  • Hakkımızda
  • Facebook
  • Twitter
  • RSS

© Yazılım Dillerinin Buluşma Noktası | Kaynak belirtildiği sürece makaleler kopyalanabilir.
YazilimDilleri.Net sitesinde yer alan kullanıcıların oluşturduğu tüm içeriklerin yayınlanması ile ilgili yasal yükümlülükler içeriği oluşturan kullanıcıya aittir, YazilimDilleri.Net hiçbir şekilde sorumlu değildir.

Kapat

Giriş Yap

Kullanıcı Adı

Şifre

Şifremi Unuttum

KULLANICI GİRİŞİ