Komut Kalıbı
Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 56 / 70.
Komut deseni, bir isteği, o istekle ilgili tüm bilgileri içeren bağımsız bir nesneye dönüştüren davranışsal bir desendir. Bu dönüşüm; istekleri metot argümanları olarak iletmenize, kuyruğa almanıza, günlüğe kaydetmenize veya geri alınabilir işlemleri desteklemenize olanak tanır.
Bu kalıp, bir işlemi çağıran nesneyi, işlemi nasıl gerçekleştireceğini bilen nesneden ayırır. Dört temel bileşenden oluşur: bir komut arayüzü, somut komutlar, bir alıcı (asıl işi yapan nesne) ve bir çağırıcı (komutları tetikleyen nesne).
public interface ICommand
{
void Execute();
}
public class Light // Alıcı
{
public void TurnOn() => Console.WriteLine("Light is ON");
public void TurnOff() => Console.WriteLine("Light is OFF");
}
public class TurnOnCommand : ICommand
{
private Light _light;
public TurnOnCommand(Light light) => _light = light;
public void Execute() => _light.TurnOn();
}
public class TurnOffCommand : ICommand
{
private Light _light;
public TurnOffCommand(Light light) => _light = light;
public void Execute() => _light.TurnOff();
}Çağıran, ne yaptıklarını bilmeden komutları saklar ve yürütür:
public class RemoteControl // Çağırıcı
{
private ICommand _command;
public void SetCommand(ICommand command) => _command = command;
public void PressButton() => _command.Execute();
}
// Kullanım
var light = new Light();
var remote = new RemoteControl();
remote.SetCommand(new TurnOnCommand(light));
remote.PressButton(); // Light AÇIK
remote.SetCommand(new TurnOffCommand(light));
remote.PressButton(); // Light KAPALICommand kalıbı, özellikle geri alma işlevselliğini, makro kaydını veya işlemleri daha sonra yürütülmek üzere sıraya almayı uygulamak için oldukça güçlüdür. Her komut, bir eylemi gerçekleştirmek için gereken her şeyi kapsüller ve bu da sisteminizi daha esnek ve genişletilebilir hâle getirir.
Görev
KolayCommand kalıbını kullanarak bir metin düzenleyici komut sistemi oluşturalım. Ekleme ve metin silme gibi düzenleme işlemlerinin komut nesneleri olarak kapsüllendiği ve düzenleyicinin bunları birleşik bir arayüz üzerinden çalıştırabildiği bir sistem oluşturacaksın.
Kodunu üç dosyaya ayıracaksın:
Command.cs:ICommandad alanında tek birTextEditormetoduna sahip birExecute()arayüzü tanımla. Ardından iki somut komut sınıfı oluştur:InsertCommand- yapıcısında birDocumentve bir stringtextalır. Çalıştırıldığında metni belgeye ekler veInserted: {text}yazdırırDeleteCommand- yapıcısında birDocumentve birint countalır. Çalıştırıldığında belgedeki soncountkarakteri kaldırır veDeleted: {count} charactersyazdırır
Document.cs: Aynı ad alanında birDocumentsınıfı oluştur. Bu sınıf, metin işlemlerini gerçekten gerçekleştiren alıcıdır. Şunlara sahip olmalıdır:- İçeriği depolamak için özel bir string alan (boş dize olarak başlatılır)
- İçeriğe metin ekleyen bir
Append(string text)metodu - Son
RemoveLast(int count)karakteri kaldıran bircountmetodu (count içerik uzunluğunu aşarsa tüm içeriği temizle) - Geçerli içeriği döndüren bir
GetContent()metodu
Program.cs: çağıran olarak görev yapan birEditorsınıfı oluştur. Bu sınıfın birSetCommand(ICommand command)metodu ve geçerli komutu çalıştıran birExecuteCommand()metodu olmalıdır. Ana kodunda, bir dizi düzenleme işlemini işleyerek command kalıbını göster.
Aşağıdaki girdileri alacaksın:
- Çalıştırılacak komutların sayısı
- Her komut için: komut türü (
insertveyadelete), ardından eklenecek metin veya silinecek karakter sayısı
Tüm komutları çalıştırdıktan sonra, son belge içeriğini yeni bir satırda Content: {content} biçiminde yazdır.
Örneğin girdiler şöyleyse:
4
insert
Hello
insert
World
delete
3
insert
!Çıktı şöyle olmalıdır:
Inserted: Hello
Inserted: World
Deleted: 3 characters
Inserted: !
Content: Hello Wo!Editor (çağıran) metin işleme hakkında hiçbir şey bilmez; kendisine verilen komutu çalıştırması yeterlidir. Komutlar hem eylemi hem de alıcıyı kapsüller. Bu sayede düzenleyiciyi değiştirmeden ReplaceCommand gibi yeni işlemler eklemek kolaylaşır!
Kendin dene
using System;
using TextEditor;
// TODO: Editor sınıfını oluşturun (invoker)
public class Editor
{
// TODO: Mevcut komutu saklamak için özel bir alan ekleyin
private ICommand _command;
// TODO: SetCommand metodunu uygulayın
public void SetCommand(ICommand command)
{
// TODO: Komutu saklayın
}
// TODO: ExecuteCommand metodunu uygulayın
public void ExecuteCommand()
{
// TODO: Mevcut komutu çalıştırın
}
}
class Program
{
public static void Main(string[] args)
{
// Komut sayısını oku
int n = Convert.ToInt32(Console.ReadLine());
// Belgeyi oluşturun (receiver)
Document document = new Document();
// Editörü oluşturun (invoker)
Editor editor = new Editor();
// TODO: Her komutu işleyin
for (int i = 0; i < n; i++)
{
string commandType = Console.ReadLine();
// TODO: commandType değerine göre uygun komutu oluşturun
// - Eğer "insert" ise: metni oku ve InsertCommand oluştur
// - Eğer "delete" ise: sayıyı oku ve DeleteCommand oluştur
// Ardından komutu editöre atayın ve çalıştırın
}
// TODO: Nihai içeriği "Content: {content}" formatında yazdırın
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici Dosyalarİsim Alanları ve YönergelerSınıf ve Nesnelere Giriş'this' Anahtar KelimesiMetotlar ve ParametrelerAlanlar ve ÖzelliklerYapıcı MetotlarNesne BaşlatıcılarÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (:) Sözdizimi'base' Anahtar KelimesiVirtual ve Override Anahtar KelimeleriSealed Sınıflar'object' Temel SınıfıÖzet - Çalışan Hiyerarşisi7İleri Düzey Özellikler
Operatör Aşırı Yüklemeİndeksleyiciler (this[])ToString() Geçersiz KılmaGenişletme MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişThread-Safe SingletonFactory KalıbıObserver Kalıbı (Olaylar)Strategy Kalıbı2Özellikler ve Statik Üyeler
Otomatik Uygulanan ÖzelliklerSadece Okunur/Yazılır ÖzelliklerStatik Alanlar ve MetotlarStatik Sınıflarİfade Gövdeli Üyeler5Polimorfizm ve Arayüzler
Derleme vs Çalışma Zamanı PolimorfizmiArayüz vs Soyut SınıfÇoklu ArayüzlerBelirgin ArayüzlerUpcasting ve DowncastingÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kalıtım yerine KompozisyonGenerics (Sınıflar ve Metotlar)Delegates ve EventlerAttributes ve ReflectionIDisposable ve using İfadesiDependency Injection Temelleri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı3Sınıf Mimarisi
Örnek vs Statik Veri'readonly' ve 'const' Anahtar KelimeleriDestekleyici Alanlar (Backing Fields)Özet - Banka Hesabı Yöneticisi6Kapsülleme
Erişim BelirleyicilerKapsülleme için ÖzelliklerVeri Gizleme UygulamasıDeğişmezlik KalıplarıÖzet - Öğrenci KayıtlarıKendi başına pratik yap: Online C# derleyicisi