Menu
Coddy logo textTech

Komut Deseni

Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 94 / 110.

Command kalıbı, bir isteği nesne olarak kapsüller ve istemcileri farklı isteklerle parametreleştirmenize, işlemleri kuyruğa almanıza veya geri alma işlevini desteklemenize olanak tanır. Bir yöntemi doğrudan çağırmak yerine, eylemi saklanabilen, aktarılabilen veya daha sonra yürütülebilen bir komut nesnesi içinde sararsınız.

Bu kalıp üç temel bileşen içerir: execute metoduna sahip bir Command arayüzü, belirli eylemleri uygulayan Concrete Commands ve asıl işi gerçekleştiren bir Receiver. İsteğe bağlı bir Invoker, ne yaptıklarını bilmeden komutları tetikler:

abstract class Command {
  void execute();
}

class Light {
  void turnOn() => print('Light is ON');
  void turnOff() => print('Light is OFF');
}

class TurnOnCommand implements Command {
  final Light light;
  TurnOnCommand(this.light);

  @override
  void execute() => light.turnOn();
}

class TurnOffCommand implements Command {
  final Light light;
  TurnOffCommand(this.light);

  @override
  void execute() => light.turnOff();
}

class RemoteControl {
  Command? _command;

  void setCommand(Command command) {
    _command = command;
  }

  void pressButton() {
    _command?.execute();
  }
}

void main() {
  var light = Light();
  var remote = RemoteControl();

  remote.setCommand(TurnOnCommand(light));
  remote.pressButton();  // Işık AÇIK

  remote.setCommand(TurnOffCommand(light));
  remote.pressButton();  // Işık KAPALI
}

RemoteControl ışıklar hakkında hiçbir şey bilmez; yalnızca kendisine verilen komutu yürütür. Bu ayrıştırma, çağıranı değiştirmeden yeni komutlar eklemeyi kolaylaştırır. Command deseni, eylemleri birinci sınıf nesneler olarak ele almanız gereken geri alma/yineleme sistemlerini, görev kuyruklarını veya makro kaydını uygulamak için idealdir.

challenge icon

Görev

Kolay

Command kalıbını kullanarak bir metin düzenleyici komut sistemi oluşturalım! Metin işlemlerini komut nesneleri olarak kapsülleyen ve bir düzenleyicinin her işlemin ayrıntılarını bilmeden farklı eylemleri gerçekleştirmesine olanak tanıyan bir sistem oluşturacaksın. Bu, Command kalıbının klasik bir kullanım alanıdır; bunu her eylemin bir nesne olarak saklandığı bir geri alma/yineleme sistemi gibi düşünebilirsin.

Kodunu iki dosyada düzenleyeceksin:

  • commands.dart: Komut sistemini burada oluştur. Command metodunu bildiren soyut bir execute() sınıfıyla başla. Ardından, bir TextDocument alanı (başlangıçta boş) tutan ve üç metodu bulunan bir String content sınıfı (alıcı) oluştur:
    • append(String text) - metni içeriğin sonuna ekler
    • clear() - içeriği boş bir dizeye ayarlar
    • show() - Document: [content] ifadesini yazdırır
    Şimdi bir TextDocument ile çalışan üç somut komut uygula:
    • AppendCommand - oluşturucusunda bir belge ve metin alır, çalıştırıldığında metni ekler
    • ClearCommand - oluşturucusunda bir belge alır, çalıştırıldığında belgeyi temizler
    • ShowCommand - oluşturucusunda bir belge alır, çalıştırıldığında içeriğini gösterir
    Son olarak, komutların bir listesini saklayan bir TextEditor sınıfı (çağırıcı) oluştur. Komutları sıraya almak için bir addCommand(Command command) metodu ve sıraya alınan tüm komutları sırayla çalıştıran bir runAll() metodu bulunmalıdır.
  • main.dart: Komut dosyanı içe aktar ve Command kalıbını göster. Bir TextDocument ve bir TextEditor oluştur. Aşağıdaki komutları sırayla sıraya al: Hello ekle, World ekle, belgeyi göster, ! ekle, tekrar göster, belgeyi temizle ve son kez göster. Ardından sıraya alınan tüm komutları çalıştır.

TextEditor'ın ekleme, temizleme veya gösterme hakkında hiçbir şey bilmediğine dikkat et; yalnızca kendisine verilen komutları çalıştırır. Bu ayrıştırma, Command kalıbının özüdür!

Beklenen çıktı:

Document: Hello World
Document: Hello World!
Document: 

Kendin dene

import 'commands.dart';

void main() {
  // TODO: Bir TextDocument örneği oluşturun

  // TODO: Bir TextEditor örneği oluşturun

  // TODO: Aşağıdaki komutları sırasıyla kuyruğa ekleyin:
  // 1. "Hello" ekle
  // 2. " World" ekle
  // 3. Belgeyi göster
  // 4. "!" ekle
  // 5. Belgeyi tekrar göster
  // 6. Belgeyi temizle
  // 7. Belgeyi son bir kez göster

  // TODO: Kuyruğa alınan tüm komutları çalıştırın
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online Dart derleyicisi