本文将带来最实用的 8 种设计模式及其典型应用场景!一、模块模式(Module Pattern)
核心思想:
const Counter = (function () { let count = 0;
return { increment() { count++; }, getCount() { return count; }, };})();
Counter.increment();console.log(Counter.getCount());
二、工厂模式(Factory Pattern)
核心思想:
class Button { constructor(text, color) { this.text = text; this.color = color; }}
function createButton(type) { switch (type) { case 'primary': return new Button('Submit', 'blue'); case 'danger': return new Button('Delete', 'red'); default: return new Button('Button', 'gray'); }}
const btn = createButton('primary');
三、单例模式(Singleton Pattern)
核心思想:
class Logger { constructor() { if (!Logger.instance) { this.logs = []; Logger.instance = this; } return Logger.instance; }
log(message) { this.logs.push(message); console.log(message); }}
const logger1 = new Logger();const logger2 = new Logger();console.log(logger1 === logger2);
四、观察者模式(Observer Pattern)
核心思想:
class EventEmitter { constructor() { this.events = {}; }
on(event, listener) { if (!this.events[event]) { this.events[event] = []; } this.events[event].push(listener); }
emit(event, ...args) { if (this.events[event]) { this.events[event].forEach(listener => listener(...args)); } }}
const emitter = new EventEmitter();emitter.on('data', (data) => console.log('Received:', data));emitter.emit('data', { id: 1 });
五、代理模式(Proxy Pattern)
核心思想:
const user = { name: 'John', age: 30};
const validatorProxy = new Proxy(user, { set(target, prop, value) { if (prop === 'age' && typeof value !== 'number') { throw new Error('Age must be a number'); } target[prop] = value; return true; }});
validatorProxy.age = '30';
六、装饰器模式(Decorator Pattern)
核心思想:
function logDecorator(target, name, descriptor) { const original = descriptor.value; descriptor.value = function (...args) { console.log(`Calling ${name} with args:`, args); return original.apply(this, args); }; return descriptor;}
class Calculator { @logDecorator add(a, b) { return a + b; }}
const calc = new Calculator();calc.add(2, 3);
七、策略模式(Strategy Pattern)
核心思想:
const strategies = { add: (a, b) => a + b, subtract: (a, b) => a - b, multiply: (a, b) => a * b,};
function calculate(strategy, a, b) { return strategies[strategy](a, b);}
console.log(calculate('multiply', 3, 4));
八、组合模式(Composite Pattern)
核心思想:
树形结构统一处理,让单对象和组合对象行为一致。
应用场景:菜单组件、文件系统、UI 组件树。
class MenuItem { constructor(name) { this.name = name; }
display() { console.log(`Menu Item: ${this.name}`); }}
class Menu { constructor(name) { this.name = name; this.children = []; }
add(child) { this.children.push(child); }
display() { console.log(`Menu: ${this.name}`); this.children.forEach(child => child.display()); }}
const rootMenu = new Menu('Root');rootMenu.add(new MenuItem('Home'));const subMenu = new Menu('Settings');subMenu.add(new MenuItem('Profile'));rootMenu.add(subMenu);rootMenu.display();
如何选择设计模式?
优先解决问题:不要为了用模式而用模式。
关注代码可维护性:模式应减少耦合,增强扩展性。
结合语言特性:JavaScript 适合函数式与原型链,灵活运用闭包和高阶函数。
框架生态参考:如 React 的 Hooks、Vue 的 Composition API 已内置模式思想。
总结
核心原则:理解模式背后的设计思想(如解耦、复用、扩展),比死记代码更重要。
阅读原文:原文链接
该文章在 2025/4/23 10:12:39 编辑过