Menu
Coddy logo textTech

Komut Kalıbı

Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 70 / 87.

Komut Deseni, bir isteği istekle ilgili tüm bilgileri içeren bağımsız bir nesneye dönüştüren davranışsal bir tasarım desenidir. Bu dönüşüm, istekleri yöntem bağımsız değişkenleri olarak iletmenize, bir isteğin yürütülmesini geciktirmenize veya kuyruğa almanıza ve geri alınabilir işlemleri desteklemenize olanak tanır.

Bunu bir restoran gibi düşün: aşçıya ne pişireceğini doğrudan söylemek yerine siparişini bir kâğıda yazarsın. Garson (invoker), kâğıdı (command) mutfağa götürür; burada sipariş sıraya alınabilir, önceliklendirilebilir veya hatta iptal edilebilir. Bu desen, işlemi çağıran nesneyi onu gerçekleştiren nesneden ayırır.

Desenin dört temel bileşeni vardır: execute metodunu bildiren bir Command arayüzü, belirli eylemleri gerçekleştiren ConcreteCommand sınıfları, asıl işi yapan bir Receiver ve komutları tetikleyen bir Invoker:

interface Command {
    void execute();
}
class Light {  // Alıcı
    public void turnOn() {
        System.out.println("Light is ON");
    }
    public void turnOff() {
        System.out.println("Light is OFF");
    }
}
class LightOnCommand implements Command {
    private Light light;
    
    public LightOnCommand(Light light) {
        this.light = light;
    }
    
    public void execute() {
        light.turnOn();
    }
}
class RemoteControl {  // Çağırıcı
    private Command command;
    
    public void setCommand(Command command) {
        this.command = command;
    }
    
    public void pressButton() {
        command.execute();
    }
}

Çağıran, hangi eylemin gerçekleştirileceğini bilmez. Yalnızca execute() çağrısını yapar:

Light light = new Light();
Command lightOn = new LightOnCommand(light);

RemoteControl remote = new RemoteControl();
remote.setCommand(lightOn);
remote.pressButton();  // Çıktı: Light is ON

Command Pattern; işlemleri sıraya almanız, geri alma/yineleme işlevselliğini uygulamanız veya görevleri daha sonra yürütülmek üzere zamanlamanız gerektiğinde öne çıkar. Her komut, bir eylemi gerçekleştirmek için gereken her şeyi kapsüller ve sisteminizi daha esnek ve genişletilebilir hâle getirir.

challenge icon

Görev

Kolay

Komut Deseni'ni kullanarak akıllı bir ev otomasyon sistemi oluşturalım! Çeşitli ev cihazlarının komutlar aracılığıyla kontrol edilebildiği; eylemlerin sıraya alınabildiği, yürütülebildiği ve hatta daha sonra kullanılmak üzere saklanabildiği bir sistem oluşturacaksın. Tıpkı her cihazın dahili olarak nasıl çalıştığını bilmesine gerek olmayan evrensel bir uzaktan kumanda gibi.

Kodunu dört dosya arasında düzenleyeceksin:

  • Command.java: Tüm cihaz komutlarının uygulayacağı Command arayüzünü tanımla. Komutun eylemini gerçekleştiren tek bir execute() yöntemi bildirmelidir.
  • Devices.java: Akıllı ev cihazlarını temsil eden iki alıcı sınıf oluştur:

    Television - powerOn() yazdıran TV is now ON, powerOff() yazdıran TV is now OFF ve setChannel(int channel) yazdıran TV channel set to [channel] yöntemlerine sahiptir.

    Thermostat - setTemperature(int temp) yazdıran Thermostat set to [temp] degrees ve turnOff() yazdıran Thermostat turned OFF yöntemlerine sahiptir.

  • Commands.java: Cihaz işlemlerini kapsülleyen somut komut sınıfları oluştur:

    TVOnCommand - kurucusunda bir Television alır ve yürütüldüğünde powerOn() yöntemini çağırır.

    TVOffCommand - kurucusunda bir Television alır ve yürütüldüğünde powerOff() yöntemini çağırır.

    TVChannelCommand - kurucusunda bir Television ve bir int channel alır ve yürütüldüğünde bu kanal ile setChannel() yöntemini çağırır.

    ThermostatSetCommand - kurucusunda bir Thermostat ve bir int temperature alır ve yürütüldüğünde bu değer ile setTemperature() yöntemini çağırır.

  • Main.java: Bir komutu saklamak için RemoteControl yöntemine ve saklanan komutu yürütmek için setCommand(Command cmd) yöntemine sahip bir pressButton() sınıfı (çağıran) oluştur.

    main yönteminde iki girdi alacaksın: bir TV kanal numarası (tam sayı) ve bir termostat sıcaklığı (tam sayı).

    Bir Television ve bir Thermostat oluştur. Bir RemoteControl oluştur ve Komut Deseni'ni aşağıdaki şekilde kullanarak göster:

    1. Bir TVOnCommand ayarla ve düğmeye bas
    2. Girdiğin kanal ile bir TVChannelCommand ayarla ve düğmeye bas
    3. Girdiğin sıcaklık ile bir ThermostatSetCommand ayarla ve düğmeye bas
    4. Bir TVOffCommand ayarla ve düğmeye bas

Sırasıyla iki girdi alacaksın: TV kanalı (tam sayı) ve termostat sıcaklığı (tam sayı).

Örneğin, girdiler 5 ve 72 olduğunda çıktın şöyle olur:

TV is now ON
TV channel set to 5
Thermostat set to 72 degrees
TV is now OFF

RemoteControl'un cihazlarla hiçbir zaman doğrudan etkileşime girmediğine dikkat et. Yalnızca Command arayüzünü bilir. Her komut, eylemini gerçekleştirmek için gereken her şeyi kapsüller; bu da çağıranı değiştirmeden yeni cihazlar ve komutlar eklemeyi kolaylaştırır!

Kendin dene

import java.util.Scanner;

// TODO: RemoteControl sınıfını (çağırıcı) şunlarla oluştur:
// - bir komutu saklamak için setCommand(Command cmd) metodu
// - saklanan komutu yürütmek için pressButton() metodu

class RemoteControl {
    // TODO: RemoteControl'ü uygula
}

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Girdileri oku
        int channel = scanner.nextInt();
        int temperature = scanner.nextInt();
        
        // TODO: Bir Television ve bir Thermostat oluştur
        
        // TODO: Bir RemoteControl oluştur
        
        // TODO: Command Pattern'i göster:
        // 1. Bir TVOnCommand ayarla ve düğmeye bas
        // 2. Girdi kanalı ile bir TVChannelCommand ayarla ve düğmeye bas
        // 3. Set a ThermostatSetCommand with the input temperature and press the button
        // 4. Bir TVOffCommand ayarla ve düğmeye bas
        
        scanner.close();
    }
}
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 Java derleyicisi