تخطَّ إلى المحتوى

🧩 شرح أنماط التصميم (Design Patterns)

الأنماط في الأطر الحديثة (React, Django, NestJS)

الدرس 21 من 24· ⏱ 3 دقائق قراءة

React Patterns

Hooks - Observer Pattern

import { useState, useEffect, createContext, useContext } from "react";

// custom hook - نمط Observer
function useWindowSize() {
  const [size, setSize] = useState({ width: 0, height: 0 });

  useEffect(() => {
    const observer = () => {
      setSize({ width: window.innerWidth, height: window.innerHeight });
    };
    window.addEventListener("resize", observer);
    observer(); // تشغيل أول مرة
    return () => window.removeEventListener("resize", observer);
  }, []);

  return size;
}

Render Props - Strategy Pattern

interface DataProps {
  data: any[];
  loading: boolean;
  error: string | null;
}

function DataFetcher({ url, children }: {
  url: string;
  children: (props: DataProps) => React.ReactNode;
}) {
  const [state, setState] = useState<DataProps>({
    data: [], loading: true, error: null,
  });

  useEffect(() => {
    fetch(url)
      .then((res) => res.json())
      .then((data) => setState({ data, loading: false, error: null }))
      .catch((err) => setState({ data: [], loading: false, error: err.message }));
  }, [url]);

  return <>{children(state)}</>;
}

// الاستخدام
<DataFetcher url="/api/users">
  {({ data, loading, error }) =>
    loading ? <Spinner /> : <UserList users={data} />
  }
</DataFetcher>

HOC - Decorator Pattern

function withAuth<P>(Component: React.ComponentType<P>) {
  return function AuthenticatedComponent(props: P & { user?: User }) {
    const user = useAuth();
    if (!user) return <Redirect to="/login" />;
    return <Component {...props} user={user} />;
  };
}

const AdminPanel = withAuth(AdminDashboard);

Django Patterns

Middleware - Chain of Responsibility

class RequestTimingMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        import time
        start = time.time()

        response = self.get_response(request)

        duration = time.time() - start
        print(f"الطلب {request.path} استغرق {duration:.2f} ثانية")
        response["X-Duration"] = str(duration)
        return response

# settings.py
MIDDLEWARE = [
    "myapp.middleware.RequestTimingMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.middleware.security.SecurityMiddleware",
]

Signals - Observer Pattern

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.core.mail import send_mail

@receiver(post_save, sender=Order)
def send_order_confirmation(sender, instance, created, **kwargs):
    if created:
        send_mail(
            subject=f"تأكيد الطلب #{instance.id}",
            message=f"تم تأكيد طلبك بقيمة {instance.total} ريال",
            from_email="store@example.com",
            recipient_list=[instance.user.email],
        )

@receiver(post_save, sender=Order)
def update_inventory(sender, instance, created, **kwargs):
    if created:
        for item in instance.items.all():
            item.product.stock -= item.quantity
            item.product.save()

NestJS Patterns

DI - Injector Pattern

@Module({
  imports: [DatabaseModule],
  controllers: [OrderController],
  providers: [
    OrderService,
    {
      provide: PaymentGateway,
      useClass: StripePaymentGateway, // Strategy
    },
    {
      provide: "CACHE_TTL",
      useValue: 300,
    },
  ],
})
export class OrderModule {}

Guards - Strategy Pattern

@Injectable()
export class RolesGuard implements CanActivate {
  constructor(private reflector: Reflector) {}

  canActivate(context: ExecutionContext): boolean {
    const requiredRoles = this.reflector.get<string[]>(
      "roles",
      context.getHandler(),
    );
    if (!requiredRoles) return true;

    const { user } = context.switchToHttp().getRequest();
    return requiredRoles.includes(user.role);
  }
}

@Controller("orders")
export class OrderController {
  @Post()
  @UseGuards(AuthGuard, RolesGuard)
  @SetMetadata("roles", ["admin", "manager"])
  createOrder(@Body() dto: CreateOrderDto) {
    return this.orderService.create(dto);
  }
}

Interceptors - Decorator Pattern

@Injectable()
export class LoggingInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    const req = context.switchToHttp().getRequest();
    console.log(`طلب وارد: ${req.method} ${req.url}`);

    const now = Date.now();
    return next.handle().pipe(
      tap(() => console.log(`استغرق ${Date.now() - now}ms`)),
    );
  }
}

⚠️ ملاحظة: الأطر الحديثة تدمج أنماط التصميم بشكل افتراضي. فهم الأنماط يساعدك على فهم كيفية عمل هذه الأطر بعمق.

🎯 التالي: اختبار الأنماط البرمجية

شرح الأنماط في الأطر الحديثة (React, Django, NestJS) — أنماط التصميم (Design Patterns) بالعربي
الأنماط في الأطر الحديثة (React, Django, NestJS)أنماط التصميم (Design Patterns) بالعربي · The Code Fix

📚 لمزيد من التعمّق في أنماط التصميم (Design Patterns)، راجِع البرمجة الكائنية على ويكيبيديا.

هل كان هذا الدرس مفيدًا؟