Maison >interface Web >js tutoriel >Exploiter la programmation fonctionnelle avec JavaScript
Les modèles de conception sont des solutions établies aux défis fréquents de la conception de logiciels. En les utilisant, les développeurs peuvent améliorer la lisibilité, l'évolutivité et la maintenabilité du code. Cet article explore comment TypeScript, un sur-ensemble de JavaScript de plus en plus populaire, améliore ces modèles grâce à sa sécurité de type et à ses fonctionnalités modernes. Que vous développiez une application à grande échelle ou un projet parallèle, la maîtrise des modèles de conception dans TypeScript renforcera vos compétences en développement.
Les modèles de conception sont des solutions génériques réutilisables aux défis courants de la conception de logiciels. Il ne s’agit pas de véritables codes mais plutôt de modèles permettant de résoudre ces problèmes. Issus du livre « Gang of Four » (GoF), ces modèles se répartissent en trois catégories principales :
Les fonctionnalités de TypeScript rendent la mise en œuvre de modèles de conception plus robustes :
1. Typage statique : Les erreurs sont détectées au moment de la compilation, ce qui réduit les bugs d'exécution.
2. Interfaces et génériques :Permettent des implémentations plus précises et flexibles.
3. Types Enum et Union : Simplifiez certains modèles, tels que la gestion de l'état.
4. Outils améliorés :Avec la prise en charge de l'IDE, TypeScript augmente la productivité.
Garantit qu'une classe n'a qu'une seule instance et fournit un point d'accès global à celle-ci.
Implémentation en TypeScript :
class Singleton { private static instance: Singleton; private constructor() {} // Prevent instantiation public static getInstance(): Singleton { if (!Singleton.instance) { Singleton.instance = new Singleton(); } return Singleton.instance; } } const instance1 = Singleton.getInstance(); const instance2 = Singleton.getInstance(); console.log(instance1 === instance2); // true
Cas d'utilisation : Gestion des paramètres de configuration ou des connexions à la base de données.
Fournit une interface pour créer des objets sans spécifier leurs classes exactes.
Mise en œuvre :
interface Button { render(): void; } class WindowsButton implements Button { render() { console.log("Rendering Windows button"); } } class MacButton implements Button { render() { console.log("Rendering Mac button"); } } class ButtonFactory { static createButton(os: string): Button { if (os === "Windows") return new WindowsButton(); if (os === "Mac") return new MacButton(); throw new Error("Unknown OS"); } } const button = ButtonFactory.createButton("Mac"); button.render(); // Output: Rendering Mac button
Cas d'utilisation : Frameworks d'interface utilisateur pour les applications multiplateformes.
Définit une relation un-à-plusieurs, où les modifications apportées à un objet sont notifiées à toutes ses personnes à charge.
Mise en œuvre :
class Subject { private observers: Array<() => void> = []; addObserver(observer: () => void) { this.observers.push(observer); } notifyObservers() { this.observers.forEach(observer => observer()); } } const subject = new Subject(); subject.addObserver(() => console.log("Observer 1 notified!")); subject.addObserver(() => console.log("Observer 2 notified!")); subject.notifyObservers();
Cas d'utilisation : Réactivité dans les frameworks front-end comme Angular ou React.
Définit une famille d'algorithmes, encapsule chacun et les rend interchangeables.
Mise en œuvre :
interface PaymentStrategy { pay(amount: number): void; } class CreditCardPayment implements PaymentStrategy { pay(amount: number) { console.log(`Paid ${amount} using Credit Card`); } } class PayPalPayment implements PaymentStrategy { pay(amount: number) { console.log(`Paid ${amount} using PayPal`); } } class PaymentContext { constructor(private strategy: PaymentStrategy) {} executePayment(amount: number) { this.strategy.pay(amount); } } const payment = new PaymentContext(new PayPalPayment()); payment.executePayment(100); // Paid 100 using PayPal
Cas d'utilisation : Systèmes de paiement dans les plateformes de commerce électronique.
Ajoute dynamiquement une nouvelle fonctionnalité à un objet.
Mise en œuvre :
class Singleton { private static instance: Singleton; private constructor() {} // Prevent instantiation public static getInstance(): Singleton { if (!Singleton.instance) { Singleton.instance = new Singleton(); } return Singleton.instance; } } const instance1 = Singleton.getInstance(); const instance2 = Singleton.getInstance(); console.log(instance1 === instance2); // true
Cas d'utilisation : Ajout de fonctionnalités à un produit dans un panier.
Pattern | Category | Use Case | Benefit |
---|---|---|---|
Singleton | Creational | Managing global state like configurations | Guarantees single instance |
Factory | Creational | UI components or APIs | Decouples creation logic |
Observer | Behavioral | Event systems in frameworks | Simplifies communication |
Strategy | Behavioral | Algorithm selection in runtime | Enhances flexibility |
Decorator | Structural | Extending class functionality | Adds dynamic capabilities |
Cas d'utilisation
Refactoring to Patterns
Joshua Kerievsky
On se retrouve dans le prochain article, mon garçon ! ?
Mon site personnel : https://shafayet.zya.me
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!