Aké vzory návrhu ste použili v praxi?
sobes.tech AI
Odpoveď od AI
V praxi som používal nasledujúce návrhové vzory:
-
Factory Method (Továrenská metóda): Na vytváranie objektov rôznych typov bez špecifikácie konkrétnej triedy. Užitočné pri práci s rôznymi zdrojmi dát alebo konfiguráciami.
// Príklad použitia továrenského vzoru class DataReader { read() { throw new Error("Metóda nie je implementovaná"); } } class FileReader extends DataReader { read() { console.log("Čítanie dát zo súboru..."); } } class NetworkReader extends DataReader { read() { console.log("Čítanie dát zo siete..."); } } class DataReaderFactory { createReader(type) { switch (type) { case "file": return new FileReader(); case "network": return new NetworkReader(); default: throw new Error("Neznámy typ čítača"); } } } const factory = new DataReaderFactory(); const fileReader = factory.createReader("file"); fileReader.read(); -
Singleton (Jednotka): Zabezpečenie, že existuje iba jedna inštancia triedy a jej globálny prístup. Často sa používa pre správcu konfigurácií alebo pripojenia k databázam.
// Príklad použitia singletonu class ConfigManager { constructor() { if (ConfigManager.instance) { return ConfigManager.instance; } this.config = {}; ConfigManager.instance = this; } setConfig(key, value) { this.config[key] = value; } getConfig(key) { return this.config[key]; } } const instance1 = new ConfigManager(); const instance2 = new ConfigManager(); console.log(instance1 === instance2); // true -
Observer (Pozorovateľ): Na implementáciu vzťahu "jeden ku mnohým", kde pri zmene stavu jedného objektu (vydavateľa) sú automaticky upozornené všetky závislé objekty (odberatelia). Používa sa v systémoch oznámení, reaktívnych rozhraniach.
// Príklad použitia pozorovateľa class Observable { constructor() { this.observers = []; } subscribe(observer) { this.observers.push(observer); } unsubscribe(observer) { this.observers = this.observers.filter(obs => obs !== observer); } notify(data) { this.observers.forEach(observer => observer.update(data)); } } class Observer { update(data) { console.log("Prijaté aktualizácie:", data); } } const observable = new Observable(); const observer1 = new Observer(); const observer2 = new Observer(); observable.subscribe(observer1); observable.subscribe(observer2); observable.notify("Nové dáta dostupné!"); -
Stratégia (Strategy): Na definovanie rodín algoritmov, ich inkapsuláciu a zabezpečenie ich zameniteľnosti. Umožňuje meniť algoritmus nezávisle od klientov, ktorí ho používajú. Používa sa pre rôzne varianty spracovania dát alebo vykonávania operácií.
// Príklad použitia stratégie class PaymentStrategy { pay(amount) { throw new Error("Metóda nie je implementovaná"); } } class CreditCardPayment extends PaymentStrategy { pay(amount) { console.log(`Platba ${amount} pomocou kreditnej karty`); } } class PayPalPayment extends PaymentStrategy { pay(amount) { console.log(`Platba ${amount} pomocou PayPal`); } } class PaymentContext { setStrategy(strategy) { this.strategy = strategy; } executePayment(amount) { this.strategy.pay(amount); } } const context = new PaymentContext(); context.setStrategy(new CreditCardPayment()); context.executePayment(100); context.setStrategy(new PayPalPayment()); context.executePayment(50); -
Dekorátor (Decorator): Pre dynamické pridanie novej funkcionality objektu bez zmeny jeho štruktúry. Obaluje existujúci objekt, poskytujúc rovnaké rozhranie ako obalený objekt, ale s pridanou funkcionalitou. Užitečné pre logovanie, validáciu, cache.
// Príklad použitia dekorátora class Component { operation() { return "Základný komponent"; } } class Decorator { constructor(component) { this.component = component; } operation() { return this.component.operation(); } } class ConcreteDecoratorA extends Decorator { operation() { return `ConcreteDecoratorA(${super.operation()})`; } } class ConcreteDecoratorB extends Decorator { operation() { return `ConcreteDecoratorB(${super.operation()})`; } } const simple = new Component(); console.log(simple.operation()); const decoratorA = new ConcreteDecoratorA(simple); console.log(decoratorA.operation()); const decoratorB = new ConcreteDecoratorB(decoratorA); console.log(decoratorB.operation()); -
Модул (Module): Иако је систем модула у Node.js уграђен (CommonJS, ES Modules), шаблон Module pattern у JavaScript-у (пре појаве нативних модула) се користио за креирање приватних чланова и јавног интерфејса. Ово је основа за изградњу инкапсулираног кода.
Ови шаблони су ми помогли да креирам структуриран, мащабируем и одржив код.