دیزاین پترن Decorator از دسته ساختاری در مجموعه ۲۳ پترن مشهور Gang of Four است. رفتار آبجکت را با یک Wrapper قابل ترکیب گسترش میدهد، بدون نیاز به تغییر کلاس اصلی.
سناریوی واقعی در فروشگاه
روی سرویس محاسبه هزینه ارسال، یک لایه Cache و سپس یک لایه Logging قرار میدهیم.
نمونه در PHP
final class CachedShippingCalculator implements ShippingCalculator {
public function __construct(private ShippingCalculator $inner) {}
public function quote(string $city): int {
return Cache::remember('ship:'.$city, 600,
fn () => $this->inner->quote($city));
}
}
نمونه در پایتون
class LoggedPricing:
def __init__(self, pricing, logger):
self.pricing, self.logger = pricing, logger
def quote(self, cart):
price = self.pricing.quote(cart)
self.logger.info('Quote calculated')
return price
چه زمانی مناسب نیست؟
لایههای زیاد تشخیص منبع خطا را دشوار میکنند. ترتیب دکوراتورها میتواند روی خروجی اثر بگذارد.
برای شناخت جایگاه این پترن در سه دسته اصلی، دیزاین پترن را ببینید. مقاله دیزاین پترن باورژن و دوره آموزشی باورژن نیز منابع مرتبطاند.