أنماط التصميم في PHP: تقنيات متقدمة مع أمثلة كود
أنماط التصميم هي حلول مجربة للمشكلات النمطية التي تظهر أثناء تطوير البرمجيات. إذا كنت قد أتقنت بالفعل الأنماط الأساسية (Singleton, Factory, Observer)، فقد حان الوقت للانتقال إلى المستوى التالي. في هذه المقالة، سنقوم بتحليل أربعة أنماط سلوكية متقدمة في PHP: Strategy, Command, State, و Chain of Responsibility. ستتعلم كيف تساعد هذه الأنماط في كتابة كود مرن، قابل للصيانة، وقابل للتوسع.
1. نمط Strategy
يسمح لك نمط Strategy بتعريف عائلة من الخوارزميات، وتغليف كل منها، وجعلها قابلة للتبادل. هذا مفيد بشكل خاص عندما يكون لديك عدة طرق لأداء نفس المهمة، وتريد التبديل بينها بسهولة دون تغيير الفئة الأساسية.
متى يتم استخدامه:
- لديك عدة خيارات من الخوارزميات التي قد تتغير أثناء وقت التنفيذ.
- تريد تجنب الهياكل الشرطية الضخمة (if-else أو switch).
- يمكن إعادة استخدام الخوارزميات في أجزاء مختلفة من التطبيق.
مثال: نظام حساب تكلفة الشحن
تخيل أن لديك متجرًا إلكترونيًا، وتعتمد تكلفة الشحن على شركة النقل المختارة: Russian Post، DHL، أو خدمة البريد السريع.
<?php
// واجهة الاستراتيجية
interface ShippingStrategy {
public function calculate(float $weight, float $distance): float;
}
// استراتيجيات محددة
class RussianPostShipping implements ShippingStrategy {
public function calculate(float $weight, float $distance): float {
return ($weight * 0.5) + ($distance * 0.1);
}
}
class DHLShipping implements ShippingStrategy {
public function calculate(float $weight, float $distance): float {
return ($weight * 1.2) + ($distance * 0.3) + 10;
}
}
class CourierShipping implements ShippingStrategy {
public function calculate(float $weight, float $distance): float {
return ($weight * 0.8) + ($distance * 0.2) + 5;
}
}
// السياق
class Order {
private float $weight;
private float $distance;
private ShippingStrategy $strategy;
public function __construct(float $weight, float $distance, ShippingStrategy $strategy) {
$this->weight = $weight;
$this->distance = $distance;
$this->strategy = $strategy;
}
public function setStrategy(ShippingStrategy $strategy): void {
$this->strategy = $strategy;
}
public function getShippingCost(): float {
return $this->strategy->calculate($this->weight, $this->distance);
}
}
// الاستخدام
$order = new Order(2.5, 100, new RussianPostShipping());
echo "الشحن عبر Russian Post: " . $order->getShippingCost() . " روبل.";
$order->setStrategy(new DHLShipping());
echo "الشحن عبر DHL: " . $order->getShippingCost() . " روبل.";
?>
في هذا المثال، نقوم بتغيير خوارزمية حساب التكلفة بسهولة دون لمس فئة Order. إضافة شركة نقل جديدة يقتصر على إنشاء فئة جديدة تطبق واجهة ShippingStrategy.
2. نمط Command
يقوم نمط Command بتحويل الطلبات إلى كائنات، مما يسمح بتمرير معاملات للعملاء بطلبات مختلفة، ووضع الطلبات في قائمة انتظار، أو تسجيلها، أو دعم التراجع عن العمليات.
متى يتم استخدامه:
- تحتاج إلى تنفيذ التراجع (undo) وإعادة (redo) العمليات.
- مطلوب وضع العمليات في قائمة انتظار أو تنفيذها بشكل غير متزامن.
- تريد فصل مرسل الطلب عن مستقبله.
مثال: محرر نصوص مع إمكانية التراجع عن الإجراءات
<?php
// واجهة الأمر
interface Command {
public function execute(): void;
public function undo(): void;
}
// المستقبل (Receiver)
class
```