0Pricing
PHP Academy · Ders

Davranışsal Örüntüler: Strategy, Observer, Command

Davranışsal örüntülerle davranış ve iletişimi modelleyin.

Davranışsal Örüntüler: Strategy, Observer, Command, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, PHP Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. PHP Academy kursu toplamda 4 dersten oluşur.

Davranışı modelleme

Davranışsal kalıplar, nesnelerin nasıl işbirliği yapıp sorumluluğu dağıttığını düzenler. Gerçek PHP sistemlerinde sürekli karşımıza çıkan üç kalıba odaklanacağız:

  • Strategy — bir algoritmayı çalışma zamanında değiştirir.
  • Observer — olayları ilgili dinleyicilere yayınlar.
  • Command — bir isteği kuyruğa alabileceğiniz, günlükleyebileceğiniz veya geri alabileceğiniz bir nesneye dönüştürür.

Strategy: fikir

Strategy kalıbı, tek bir arabirimin arkasında birbirinin yerine kullanılabilen algoritma ailesi tanımlar ve istemcinin çalışma zamanında seçim yapmasına olanak tanır. Aşağıdaki kapsamlı switch yapısını çok biçimlilikle değiştirir: bağlam, elinde tuttuğu stratejiye yetki verir.

<?php
// The smell Strategy removes: branching on a type code
function price(string $type, float $base): float {
    switch ($type) {
        case 'standard': return $base + 5;
        case 'express':  return $base + 15;
        default: throw new InvalidArgumentException($type);
    }
}
echo price('express', 10), PHP_EOL; // 25

Kodda Strategy

Burada gönderim maliyeti, seçilen taşıyıcıya bağlıdır. Her strateji bir fiyatlandırma algoritmasını kapsüller; yeni bir taşıyıcı eklediğinizde bağlam değişmeden kalır.

<?php
interface ShippingStrategy { public function cost(float $weight): float; }
final class Standard implements ShippingStrategy {
    public function cost(float $w): float { return 5 + $w * 0.5; }
}
final class Express implements ShippingStrategy {
    public function cost(float $w): float { return 15 + $w * 1.2; }
}

final class Cart {
    public function __construct(private ShippingStrategy $strategy) {}
    public function setStrategy(ShippingStrategy $s): void { $this->strategy = $s; }
    public function quote(float $weight): float { return $this->strategy->cost($weight); }
}

$cart = new Cart(new Standard());
echo $cart->quote(10), PHP_EOL;     // 10
$cart->setStrategy(new Express());
echo $cart->quote(10), PHP_EOL;     // 27

Kapanımlarla Strategy

PHP'de bir Strategy'nin her zaman bir sınıfa ihtiyacı yoktur. Basit durumlarda bir callable veya birinci sınıf çağrılabilir söz dizimi tamamen geçerli bir stratejidir. Algoritmanın kendi durumu veya bağımlılıkları varsa tam sınıfları; basit ve durum içermeyen seçimler için kapanımları kullanın.

<?php
$strategies = [
    'asc'  => fn(array $a) => sort($a) ? $a : $a,
    'desc' => fn(array $a) => rsort($a) ? $a : $a,
];
$data = [3, 1, 2];
print_r($strategies['desc']($data)); // [3,2,1]

Observer: fikir

Observer kalıbı, bir öznenin durum değiştiğinde kim olduklarını bilmeden birçok gözlemciyi bilgilendirmesini sağlar. Bu, bir olayın kaynağını işleyicilerinden ayırır ve olay sistemlerinin, kancaların ve tepkisel güncellemelerin temelini oluşturur.

Kodda Observer

Özne, gözlemcilerin bir listesini tutar ve her birinde update() çağrısı yapar. Yeni dinleyiciler, öznenin mantığını değiştirmeden bağlanabilir.

<?php
interface Observer { public function update(string $event): void; }

final class OrderSubject {
    private array $observers = [];
    public function subscribe(Observer $o): void { $this->observers[] = $o; }
    public function placed(string $id): void {
        foreach ($this->observers as $o) { $o->update("order $id placed"); }
    }
}
final class EmailObserver implements Observer {
    public function update(string $e): void { echo "email: $e" . PHP_EOL; }
}
final class AuditObserver implements Observer {
    public function update(string $e): void { echo "audit: $e" . PHP_EOL; }
}

$subject = new OrderSubject();
$subject->subscribe(new EmailObserver());
$subject->subscribe(new AuditObserver());
$subject->placed('42');

Observer ve PSR-14

Modern PHP'de Observer çoğu zaman PSR-14 olay dağıtıcıları aracılığıyla ifade edilir: bir dağıtıcı, bir olay nesnesini kayıtlı dinleyicilere yönlendirir. Zihinsel model aynıdır (özne = olay, gözlemciler = dinleyiciler); ancak dağıtıcı bunları daha da birbirinden ayırır ve durdurulabilir olayları destekler. SplObserver/SplSubject, SPL içinde bulunur ancak günümüzde nadiren kullanılır.

Command: fikir

Command kalıbı, bir isteği nesne olarak kapsüller: eylemi, alıcısı ve parametreleriyle birlikte. İstek artık veri olduğundan onu kuyruğa alabilir, günlüğe yazabilir, yeniden deneyebilir veya geri alabilirsiniz. En basit komut, aşağıda gösterildiği gibi bir niyeti değer olarak somutlaştırır.

<?php
final class SendEmail {
    public function __construct(
        public readonly string $to,
        public readonly string $subject
    ) {}
}
// The request is now data you can store, serialize, or enqueue
$cmd = new SendEmail('user@example.com', 'Welcome');
echo json_encode($cmd), PHP_EOL;

Kodda Command

Her komut execute() yöntemini uygular. Bir çağıran bunları tutup çalıştırır ve yaptıkları işten bağımsız kalır. undo() eklemek bunu tam bir geri alma yığınına dönüştürür.

<?php
interface Command { public function execute(): string; }

final class Light { public bool $on = false; }
final class TurnOn implements Command {
    public function __construct(private Light $light) {}
    public function execute(): string { $this->light->on = true; return 'light on'; }
}
final class TurnOff implements Command {
    public function __construct(private Light $light) {}
    public function execute(): string { $this->light->on = false; return 'light off'; }
}

final class Invoker {
    private array $queue = [];
    public function add(Command $c): void { $this->queue[] = $c; }
    public function run(): void {
        foreach ($this->queue as $c) { echo $c->execute(), PHP_EOL; }
    }
}

$light = new Light();
$inv = new Invoker();
$inv->add(new TurnOn($light));
$inv->add(new TurnOff($light));
$inv->run();

Komut veri yolları

Çerçeveler bu kalıp üzerine bir komut veri yolu kurar: bir komut veri aktarım nesnesi tam olarak tek bir işleyiciye gönderilir. Veri yolunun çevresindeki ara katman, işlemleri, doğrulamayı ve günlüklemeyi tekdüze biçimde ekleyebilir. Komutlar düz, serileştirilebilir nesneler olduğundan aynı işleyici eşzamanlı olarak çalışabilir veya bir kuyruk çalışanına gönderilebilir.

Aralarında seçim yapma

  • Strategy: çağıran tarafından seçilen, tek işlem için birbirinin yerine kullanılabilen birçok algoritma.
  • Observer: kaynağın işleyicileri bilmediği, tek olaya verilen birçok bağımsız tepki.
  • Command: kuyruğa alınabilmesi, günlüklenebilmesi, yeniden denenebilmesi veya geri alınabilmesi için isteği nesneleştirme.

Bu kalıplar birlikte iyi çalışır: bir komut işleyicisi bir Strategy seçip Observer olayları yayınlayabilir.

Hızlı Kontrol

Gereksinimi uygun kalıpla eşleştirin.

Özet

Davranışı üç kalıpla modellediniz: algoritmaları çalışma zamanında değiştirmek için Strategy (sınıflar veya kapanımlar), durum değişikliklerini birbirinden ayrılmış dinleyicilere yayınlamak için Observer (PSR-14 dağıtıcılarının temeli) ve istekleri kuyruğa alabileceğiniz, günlükleyebileceğiniz ve geri alabileceğiniz nesnelere dönüştürmek için Command (komut veri yollarının temeli). Birlikte işbirliğini esnek, sorumlulukları ise açık tutarlar.

Sıkça Sorulan Sorular

“Davranışsal Örüntüler: Strategy, Observer, Command” dersi ücretsiz mi?

Evet — “Davranışsal Örüntüler: Strategy, Observer, Command” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve PHP Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. PHP Academy kursu toplamda 4 dersten oluşur.

“Davranışsal Örüntüler: Strategy, Observer, Command” dersinde ne öğreneceğim?

Davranışsal örüntülerle davranış ve iletişimi modelleyin. PHP Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

PHP Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te PHP Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Davranışsal Örüntüler: Strategy, Observer, Command” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu PHP Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her PHP Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. SOLID İlkelerini Uygulamada Kullanma
  2. Oluşturucu Örüntüler: Factory, Builder, Singleton
  3. Yapısal Örüntüler: Adapter, Decorator, Facade
  4. Davranışsal Örüntüler: Strategy, Observer, Command
← PHP Academy Sayfasına Dön