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 ONCommand 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.
Görev
KolayKomut 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ğıCommandarayüzünü tanımla. Komutun eylemini gerçekleştiren tek birexecute()yöntemi bildirmelidir.Devices.java: Akıllı ev cihazlarını temsil eden iki alıcı sınıf oluştur:Television-powerOn()yazdıranTV is now ON,powerOff()yazdıranTV is now OFFvesetChannel(int channel)yazdıranTV channel set to [channel]yöntemlerine sahiptir.Thermostat-setTemperature(int temp)yazdıranThermostat set to [temp] degreesveturnOff()yazdıranThermostat turned OFFyöntemlerine sahiptir.Commands.java: Cihaz işlemlerini kapsülleyen somut komut sınıfları oluştur:TVOnCommand- kurucusunda birTelevisionalır ve yürütüldüğündepowerOn()yöntemini çağırır.TVOffCommand- kurucusunda birTelevisionalır ve yürütüldüğündepowerOff()yöntemini çağırır.TVChannelCommand- kurucusunda birTelevisionve birint channelalır ve yürütüldüğünde bu kanal ilesetChannel()yöntemini çağırır.ThermostatSetCommand- kurucusunda birThermostatve birint temperaturealır ve yürütüldüğünde bu değer ilesetTemperature()yöntemini çağırır.Main.java: Bir komutu saklamak içinRemoteControlyöntemine ve saklanan komutu yürütmek içinsetCommand(Command cmd)yöntemine sahip birpressButton()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
Televisionve birThermostatoluştur. BirRemoteControloluştur ve Komut Deseni'ni aşağıdaki şekilde kullanarak göster:- Bir
TVOnCommandayarla ve düğmeye bas - Girdiğin kanal ile bir
TVChannelCommandayarla ve düğmeye bas - Girdiğin sıcaklık ile bir
ThermostatSetCommandayarla ve düğmeye bas - Bir
TVOffCommandayarla ve düğmeye bas
- Bir
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 OFFRemoteControl'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();
}
}
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 DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarı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ıYineleyici KalıbıKendi başına pratik yap: Online Java derleyicisi