Menu
CoddyTech

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 OFF

Pola 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.

challenge icon

Tantangan

Mudah

Mari 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 antarmuka Command dengan satu method execute(): string. Ini menetapkan kontrak yang harus diikuti semua perintah editor.
  • TextEditor.php, Buat class TextEditor yang 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): string yang menambahkan teks ke konten dan mengembalikan "Written: [text]"
    • Memiliki method clear(): string yang mengosongkan konten dan mengembalikan "Content cleared"
    • Memiliki method getContent(): string yang mengembalikan konten saat ini
  • Commands.php: Sertakan file Command dan TextEditor. Buat dua class perintah yang mengimplementasikan antarmuka Command:
    • WriteCommand: Menerima TextEditor dan string teks di constructornya. Method execute() memanggil method write() milik editor dan mengembalikan hasilnya.
    • ClearCommand: Menerima TextEditor di constructornya. Method execute() memanggil method clear() 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 memanggil execute() pada perintah dan mencetak hasilnya.

    Pada baris baru, cetak konten editor saat ini dengan format berikut: Content: [content] (jika kosong, cetak saja Content: 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)

?>
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler PHP online