Harun Özer


Proje veya dijital katalog yaptırmak için
iletişim formu doldurabilirsiniz..

<< Sorumluluk Zinciri Tasarım Deseni - Chain of Responsibility Design Pattern | Interpreter Tasarım Deseni - Interpreter Design Pattern>>

Komut Tasarım Deseni - Command Design Pattern

Yazar harunozer 06 November 2012

Komut Tasarım Deseni - Command Design Pattern Command design pattern (komut tasarım deseni) behavior grubununa ait, işlemlerin nesne haline getirilip başka bir nesne(invoker) üzerinden tetiklendiği bir tasarım desenidir. Command tasarım deseninin dofactory.com a göre kullanım sıklığı 80% civarındadır.

Command design pattern (komut tasarım deseni), yapılmak istenilen işlemlerin nesneye dönüştürülüp başka bir nesne tarafından bu işlemlerin tetiklenmesi şeklindedir. Command tasarım deseninde, işlem ve işlemin tetiklenmesi yapıları birbirinden ayrılmış olur. İşlemi yapacak nesnenin birden fazla olması durumunda işlemlerin sırayla çalıştırılabilinmesini sağlamış oluruz ve aynı işlem nesnelerini uygulamanın birden fazla yerinde kullanabilir oluruz. Command tasarım deseninde 5 ana yapı vardır.

Receiver: İşlemlerin olduğu gerçek nesne.

Command: Receiver nesnesindeki işlemleri çalıştırabilecek, concrete command nesnelerinin uygulaması gereken soyut sınıf veya arayüz.

Concrete command: command nesnesini uygulayan, receiver da ki işlemlerin yani metotların çalıştırılacağı nesne veya nesneler.

Invoker: Command nesnesi türünden, içinde concrete command listesi veya bir concrete command tanımlı olan ve command nesnesindeki metotu çalıştıran nesne.

Client: Diğer nesneleri kullanarak isteği gönderen nesne.

Command tasarım deseninin uml diyagramı aşağıdadır.

 

 

Örneğin kişi nesnemiz olsun ve bu nesnemiz için ekle ve sil işlemlerimiz olsun. (Bu senaryoda kişi nesnemizin desen ile bir alakası yoktur sadece örnek olması açısından uygulamaya eklenecektir.)

Uygulamamızın class diyagramı aşağıdadır.

 

İlk önce kisi nesnemizi oluşturalım.
/// <summary>
/// Command deseni için zorunlu değil
/// </summary>
public class Kisi
{
    public int ID { get; set; }
    public string Ad { get; set; }
}
 
Kisi nesnemiz için ekle ve sil işlemlerinin yani metotlarının olduğu, tasarım desenimizde ki Invoker yapısına karşılık gelen ReceiverKisi nesnemizi oluşturalım.
/// <summary>
/// Kisi üzerinde işlemler yapan nesne.
/// </summary>
public class ReceiverKisi
{
    private Kisi _EntityKisi;
 
    public ReceiverKisi(Kisi entityKisi)
    {
        this._EntityKisi = entityKisi;
    }
 
    public void Ekle()
    {
        Console.WriteLine("{0} Eklendi.", _EntityKisi.Ad);
    }
 
    public void Sil()
    {
        Console.WriteLine("ID:{0} Silindi.", _EntityKisi.ID);
    }
}
 
ReceiverKisi nesnemizde tanımlı olan Ekle() veya Sil() metotlarını çalıştıracak, desenimizdeki Command yapısına karşılık gelen, CommandKisi soyut sınıfımızı oluşturalım. 
/// <summary>
/// ReceiverKisi deki ekle veya sil metotlarını çalıştıracak olan sınıfların uygulaması gereken abstract sınıf.
/// </summary>
public abstract class CommandKisi
{
    protected ReceiverKisi _receiverKisi;
    public CommandKisi(ReceiverKisi receiverKisi)
    {
        this._receiverKisi = receiverKisi;
    }
 
    public abstract void Execute();
}
CommandKisi abstract nesnesinden türeyen yani ReceiverKisi nesnesindeki metotları kullanan, tasarım desenimizdeki Concrete Command yapısına karşılık gelen nesnelerimizi oluşturalım.
 
/// <summary>
/// ReceiverKisi de Ekle metodunu çalıştıracak olan ConcreteCommand nesnesi.
/// </summary>
public class ConcreteCommandKisiEkle : CommandKisi
{
    public ConcreteCommandKisiEkle(ReceiverKisi receiverKisi)
        : base(receiverKisi)
    {
 
    }
 
    public override void Execute()
    {
        _receiverKisi.Ekle();
    }
}
 
/// <summary>
/// ReceiverKisi de Sil metodunu çalıştıracak olan ConcreteCommand nesnesi.
/// </summary>
public class ConcreteCommandKisiSil : CommandKisi
{
    public ConcreteCommandKisiSil(ReceiverKisi receiverKisi)
        : base(receiverKisi)
    {
 
    }
 
    public override void Execute()
    {
        _receiverKisi.Sil();
    }
}
 
Şimdi de tasarım desenimizde ki Invoker yapısına karşılık gelen, yani CommandKisi soyut sınıfını kullanan nesnelerin Execute() metodunu çalıştıracak olan InvokerKisi nesnemizi oluşturalım.
 
/// <summary>
/// İşlemlerin çalıştırılacağı nesne.
/// </summary>
public class InvokerKisi
{
    public List<CommandKisi> CommandKisiList { get; set; }
 
    public InvokerKisi()
    {
        CommandKisiList = new List<CommandKisi>();
    }
 
    public void ExecuteAll()
    {
        if (CommandKisiList.Count == 0)
            return;
 
        foreach (CommandKisi item in CommandKisiList)
        {
            item.Execute();
        }
    }
}
 
Son olarak da tasarım desenimizde ki client yapısını oluşturalım.
 
class Program
{
    static void Main(string[] args)
    {
        Kisi Kisi = new Kisi { ID = 1, Ad = "Ahmet" };
 
        ReceiverKisi rk1 = new ReceiverKisi(Kisi);
            
        CommandKisi ckAdd = new ConcreteCommandKisiEkle(rk1);
        CommandKisi ckSil = new ConcreteCommandKisiSil(rk1);
 
        InvokerKisi ik = new InvokerKisi();
 
        ik.CommandKisiList.Add(ckAdd);
        ik.CommandKisiList.Add(ckSil);
 
        ik.ExecuteAll();
 
        Console.ReadKey();
    }
}
Örnek uygulamayı aşağıdaki linkden indirebilirsiniz.

CommandSample.rar

Tam Sayfa
Tags tasarım desenleri,
Kategoriler c#.net, Tasarım Desenleri
İşlemler
Bu Makale 116  Kez Beğenildi.
Ali

1/5/2016 9:04:15 PM | Ali

sade ve güzel bir anlatım olmuş eline sağlık

İsim :    
e-Mail :    
Web Site :  
İmage :  
Güvenlik Kodu :  

Güvenlik Resmi
Resmi Yenile
    
Yorum :  
Tasarım Desenleri ve Mimarileri