Pola Command
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 70 dari 87.
Command Pattern adalah pola desain perilaku yang mengubah sebuah permintaan menjadi object mandiri yang berisi semua informasi tentang permintaan tersebut. Perubahan ini memungkinkan kamu meneruskan permintaan sebagai argumen method, menunda atau mengantrekan eksekusi permintaan, dan mendukung operasi yang bisa dibatalkan.
Bayangkan seperti restoran: alih-alih memberi tahu koki secara langsung apa yang harus dimasak, kamu menulis pesananmu di selembar kertas. Pelayan (pemanggil) membawa kertas itu (perintah) ke dapur, tempat pesanan tersebut bisa dimasukkan ke antrean, diprioritaskan, atau bahkan dibatalkan. Pola ini memisahkan object yang memanggil operasi dari object yang menjalankannya.
Pola ini memiliki empat komponen utama: antarmuka Command yang mendeklarasikan method execute, class ConcreteCommand yang mengimplementasikan tindakan tertentu, Receiver yang melakukan pekerjaan sebenarnya, dan Invoker yang memicu perintah:
interface Command {
void execute();
}class Light { // Penerima
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 { // Pemanggil
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void pressButton() {
command.execute();
}
}Pemanggil tidak tahu tindakan apa yang akan dilakukan. Pemanggil hanya memanggil execute():
Light light = new Light();
Command lightOn = new LightOnCommand(light);
RemoteControl remote = new RemoteControl();
remote.setCommand(lightOn);
remote.pressButton(); // output: Light is ONPola Command sangat berguna saat kamu perlu mengantrekan operasi, menerapkan fitur undo/redo, atau menjadwalkan tugas untuk dijalankan nanti. Setiap perintah merangkum semua yang diperlukan untuk melakukan suatu tindakan, sehingga sistemmu menjadi lebih fleksibel dan mudah dikembangkan.
Tantangan
MudahMari bangun sistem otomatisasi rumah pintar menggunakan Command Pattern! Kamu akan membuat sistem tempat berbagai perangkat rumah dapat dikendalikan melalui perintah, sehingga tindakan dapat diantrekan, dijalankan, bahkan disimpan untuk digunakan nanti, seperti remote universal yang tidak perlu mengetahui cara kerja setiap perangkat secara internal.
Kamu akan mengatur kodemu dalam empat file:
Command.java: Definisikan interfaceCommandyang akan diimplementasikan oleh semua perintah perangkat. Interface ini harus mendeklarasikan satu methodexecute()yang menjalankan tindakan perintah.Devices.java: Buat dua class penerima yang mewakili perangkat rumah pintar:Televisionmemiliki methodpowerOn()yang mencetakTV is now ON,powerOff()yang mencetakTV is now OFF, dansetChannel(int channel)yang mencetakTV channel set to [channel].Thermostatmemiliki methodsetTemperature(int temp)yang mencetakThermostat set to [temp] degreesdanturnOff()yang mencetakThermostat turned OFF.Commands.java: Buat class perintah konkret yang merangkum operasi perangkat:TVOnCommandmenerimaTelevisiondi constructornya dan memanggilpowerOn()saat dijalankan.TVOffCommandmenerimaTelevisiondi constructornya dan memanggilpowerOff()saat dijalankan.TVChannelCommandmenerimaTelevisiondanint channeldi constructornya, lalu memanggilsetChannel()dengan channel tersebut saat dijalankan.ThermostatSetCommandmenerimaThermostatdanint temperaturedi constructornya, lalu memanggilsetTemperature()dengan nilai tersebut saat dijalankan.Main.java: Buat classRemoteControl(invoker) yang memiliki methodsetCommand(Command cmd)untuk menyimpan perintah danpressButton()untuk menjalankan perintah yang tersimpan.Di method main, kamu akan menerima dua input: nomor channel TV (integer) dan suhu thermostat (integer).
Buat
TelevisiondanThermostat. BuatRemoteControldan demonstrasikan Command Pattern dengan cara:- Menetapkan
TVOnCommanddan menekan tombol - Menetapkan
TVChannelCommanddengan channel inputmu dan menekan tombol - Menetapkan
ThermostatSetCommanddengan suhu inputmu dan menekan tombol - Menetapkan
TVOffCommanddan menekan tombol
- Menetapkan
Kamu akan menerima dua input secara berurutan: channel TV (integer) dan suhu thermostat (integer).
Misalnya, dengan input 5 dan 72, outputmu akan menjadi:
TV is now ON
TV channel set to 5
Thermostat set to 72 degrees
TV is now OFFPerhatikan bahwa RemoteControl tidak pernah berinteraksi langsung dengan perangkat. Class ini hanya mengetahui interface Command. Setiap perintah merangkum semua yang dibutuhkan untuk menjalankan tindakannya, sehingga kamu dapat menambahkan perangkat dan perintah baru dengan mudah tanpa mengubah invoker!
Coba sendiri
import java.util.Scanner;
// TODO: Buat class RemoteControl (pemanggil) dengan:
// - method setCommand(Command cmd) untuk menyimpan perintah
// - method pressButton() untuk menjalankan perintah yang tersimpan
class RemoteControl {
// TODO: Implementasikan RemoteControl
}
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Baca input
int channel = scanner.nextInt();
int temperature = scanner.nextInt();
// TODO: Buat Television dan Thermostat
// TODO: Buat RemoteControl
// TODO: Tunjukkan pola Command:
// 1. Atur TVOnCommand lalu tekan tombol
// 2. Atur TVChannelCommand dengan channel dari input lalu tekan tombol
// 3. Atur ThermostatSetCommand dengan suhu dari input lalu tekan tombol
// 4. Atur TVOffCommand lalu tekan tombol
scanner.close();
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPClass dan ObjectKata Kunci thisMethodField (Atribut)Method KonstruktorOverloading KonstruktorRangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan Dasar (extends)Kata Kunci superMethod Overriding (@Override)Rantai KonstruktorKelas ObjectPewarisan Tunggal dan BertingkatMengapa Tidak Ada Pewarisan Multi-KelasRangkuman: Hierarki Karyawan7method Khusus & class Object
method toString()equals() dan hashCode()method clone()compareTo() dan ComparableAntarmuka ComparatorUlasan: Pengurutan Kustom10Penanganan Exception dalam OOP
Hierarki class ExceptionException KustomError Checked vs UncheckedPola Try-with-ResourcesRekap: Pengguna Tervalidasi2Modifier Akses & Enkapsulasi
Ikhtisar Tingkat AksesMethod Getter dan SetterPenyembunyian InformasiKata Kunci finalUlasan: Pengelola Rekening Bank5Polimorfisme
Dasar method overloadingMethod overriding (Saat program berjalan)Upcasting dan downcastingOperator instanceofclass dan method abstrakUlasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanAgregasi vs Komposisiinner, nested, dan anonymous classEnum dan method Enumrecord (Java 16+)sealed class (Java 17+)11Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonPola FactoryPola BuilderPola ObserverPola Strategy3property class dan Anggota Statis
Variabel Instance vs Statismethod StatisBlok StatisKonstanta (static final)Rangkuman: Penghitung dan Utilitas6Antarmuka & Kelas Abstrak
Pengantar AntarmukaMengimplementasikan AntarmukaImplementasi Beberapa AntarmukaDefault & Static pada AntarmukaKelas Abstrak vs AntarmukaAntarmuka FungsionalRekap: Sistem Pembayaran9Generik
Pengantar GenerikClass GenerikMethod GenerikParameter Tipe BerbatasWildcard (?, extends, super)Ulasan: Wadah Generik12Pola Desain Bagian 2
Pola CommandPola AdapterPola DecoratorPola Template MethodPola StatePola CompositePola IteratorLatihan sendiri: Compiler Java online