Pola Perintah
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 75 dari 91.
Command Pattern adalah pola desain perilaku yang mengubah permintaan menjadi object mandiri yang memuat semua informasi tentang permintaan tersebut. Transformasi ini memungkinkan kamu meneruskan permintaan sebagai argumen method, menunda atau mengantrekan eksekusi permintaan, dan mendukung operasi yang dapat dibatalkan.
Bayangkan sebuah restoran.
Saat kamu memesan makanan, pelayan menuliskan pesananmu di secarik kertas (perintah), membawanya ke dapur, lalu koki melaksanakannya. Pelayan tidak perlu tahu cara memasak, mereka hanya menyampaikan perintah.
Ini memisahkan peminta dari pelaksana.
Berikut implementasi dasar:
<?php
interface Command {
public function execute(): string;
}class Light {
public function on(): string { return "Light is ON"; }
public function off(): string { return "Light is OFF"; }
}class LightOnCommand implements Command {
public function __construct(private Light $light) {}
public function execute(): string {
return $this->light->on();
}
}class LightOffCommand implements Command {
public function __construct(private Light $light) {}
public function execute(): string {
return $this->light->off();
}
}
Pemanggil memicu perintah tanpa mengetahui apa yang dilakukannya:
<?php
class RemoteControl {
public function press(Command $command): string {
return $command->execute();
}
}$light = new Light();
$remote = new RemoteControl();
echo $remote->press(new LightOnCommand($light)) . "\n";
echo $remote->press(new LightOffCommand($light));
Output:
Light is ON
Light is OFFPola Command sangat cocok saat kamu perlu mengantrekan operasi, menerapkan fungsi undo, atau mencatat tindakan. Setiap perintah berdiri sendiri, sehingga kamu dapat menambahkan perintah baru dengan mudah tanpa mengubah kode yang sudah ada.
Tantangan
MudahMari buat sistem perintah editor teks menggunakan Command Pattern. Editor teks sering perlu mendukung operasi seperti menulis teks, menghapus teks, dan membatalkan tindakan: setiap operasi menjadi object perintah mandiri yang dapat dijalankan melalui antarmuka terpadu.
Kamu akan mengatur kodemu dalam empat file:
Command.php: Definisikan antarmukaCommanddengan satu methodexecute(): string. Ini menetapkan kontrak yang harus diikuti semua perintah editor.TextEditor.php, Buat classTextEditoryang mewakili penerima, yaitu object yang benar-benar melakukan pekerjaan. Editor kamu harus:- Menyimpan konten teks saat ini (mulai dengan string kosong)
- Memiliki method
write(string $text): stringyang menambahkan teks ke konten dan mengembalikan"Written: [text]" - Memiliki method
clear(): stringyang mengosongkan konten dan mengembalikan"Content cleared" - Memiliki method
getContent(): stringyang mengembalikan konten saat ini
Commands.php: Sertakan file Command dan TextEditor. Buat dua class perintah yang mengimplementasikan antarmukaCommand:WriteCommand: MenerimaTextEditordan string teks di constructornya. Methodexecute()memanggil methodwrite()milik editor dan mengembalikan hasilnya.ClearCommand: MenerimaTextEditordi constructornya. Methodexecute()memanggil methodclear()milik editor dan mengembalikan hasilnya.
main.php: Sertakan file Commands. Kamu akan menerima dua input: tipe perintah ("write"atau"clear") dan string teks (hanya digunakan untuk perintah write).Buat instance
TextEditor. Berdasarkan tipe perintah, buat object perintah yang sesuai. Lalu, buat fungsi pemanggil atau mekanisme sederhana yang memanggilexecute()pada perintah dan mencetak hasilnya.Pada baris baru, cetak konten editor saat ini dengan format berikut:
Content: [content](jika kosong, cetak sajaContent:tanpa apa pun setelah spasi).
Tantangan ini menunjukkan cara Command Pattern mengenkapsulasi setiap operasi sebagai object. Pemanggil tidak perlu tahu apakah yang dijalankan adalah perintah write atau clear. Pemanggil cukup memanggil execute() dan membiarkan perintah menangani detailnya.
Coba sendiri
<?php
require_once 'Commands.php';
// Baca input
$commandType = trim(fgets(STDIN)); // "write" atau "clear"
$text = trim(fgets(STDIN)); // teks untuk perintah write
// TODO: Buat instance TextEditor
// TODO: Berdasarkan jenis perintah, buat object perintah yang sesuai
// - Jika "write", buat WriteCommand dengan editor dan teks
// - Jika "clear", buat ClearCommand dengan editor
// TODO: Buat mekanisme pemanggil yang memanggil execute() pada perintah
// dan mencetak hasilnya
// TODO: Cetak isi editor saat ini dalam format: "Content: [content]"
// (jika kosong, cukup cetak "Content: " tanpa apa pun setelah spasi)
?>Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengenalan OOPclass vs objectKata Kunci $thismethodpropertyConstructor (__construct)Destructor (__destruct)Ringkasan: Kalkulator Sederhana4Pewarisan
Pewarisan DasarKata Kunci parent::Penimpaan methodKata Kunci finalClass AbstrakRingkasan: Hierarki Karyawan7Enkapsulasi
Public, Protected, PrivateModifier Akses secara MendalamGetter dan SetterPenyembunyian InformasiPromosi Constructor (8.0)Ulasan: Sistem Catatan Siswa10Konsep OOP Lanjutan
Komposisi vs PewarisanInjeksi Dependensiclass AnonimEnum (PHP 8.1)Fiber (PHP 8.1)Pendalaman Kloning objectGenerator dan Iterator13Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola CompositePola Repository2Namespace dan Autoloading
Pengenalan NamespaceKata Kunci useStandar Autoloading PSR-4Autoloader ComposerRingkasan: Proyek yang Terorganisasi5Interface dan Kontrak
Pengenalan InterfaceMengimplementasikan InterfaceImplementasi Beberapa InterfaceInterface vs Abstract ClassPetunjuk Tipe dengan InterfaceRekap: Kalkulator Bentuk8Magic Methods
Pengantar Magic Methods__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Cloning Object__serialize & __unserializeRingkasan: Koleksi Kustom11Sistem Tipe Data dan Penanganan Error
Deklarasi TipeTipe NullableTipe Union dan IntersectionClass ExceptionHierarki Exception KustomTry, Catch, FinallyRekap: Validator Form3Property dalam class
Property instance vs staticKonstanta dalam classMethod & property staticProperty private & protectedProperty readonly (PHP 8.1)Ulasan: Pengelola Rekening Bank6Polimorfisme
Meninjau Kembali Method OverridingPolimorfisme melalui AntarmukaPetunjuk Tipe dan Tipe UnionPengikatan Statis TertundaRangkuman: Pemroses PembayaranLatihan sendiri: Compiler PHP online