设计模式是软件设计中常见问题的通用解决方案。以下是一些常见的设计模式,分为三大类:创建型模式、结构型模式和行为型模式。
这些模式提供了对象创建的机制,增加了已有代码的灵活性和可复用性。
单例模式(Singleton):
工厂方法模式(Factory Method):
抽象工厂模式(Abstract Factory):
建造者模式(Builder):
原型模式(Prototype):
这些模式处理对象组合,或对象与它们之间的关系。
适配器模式(Adapter):
装饰器模式(Decorator):
代理模式(Proxy):
外观模式(Facade):
桥接模式(Bridge):
组合模式(Composite):
享元模式(Flyweight):
这些模式专注于对象间的通信,即对象如何相互作用以及怎样分配职责。
策略模式(Strategy):
模板方法模式(Template Method):
观察者模式(Observer):
迭代器模式(Iterator):
责任链模式(Chain of Responsibility):
命令模式(Command):
备忘录模式(Memento):
状态模式(State):
访问者模式(Visitor):
中介者模式(Mediator):
解释器模式(Interpreter):
上次面试的时候被问到用代码实现订阅-发布者模式,有时间用js代码模拟一下这些设计模式。
For example
class PubSub {
constructor() {
this.events = {}; // 存储事件名称和对应的订阅者回调函数数组
}
// 订阅事件
subscribe(event, callback) {
if (!this.events[event]) {
this.events[event] = []; // 如果事件不存在,初始化一个空数组
}
this.events[event].push(callback); // 将回调函数添加到订阅者的数组
}
// 取消订阅事件
unsubscribe(event, callback) {
if (!this.events[event]) {
return;
}
this.events[event] = this.events[event].filter(cb => cb !== callback); // 移除指定的回调函数
}
// 取消特定事件的所有订阅
unsubscribeAll(event) {
if (this.events[event]) {
delete this.events[event]; // 删除所有订阅者
}
}
// 触发事件,使用 emit 作为方法名
emit(event, data) {
if (this.events[event]) {
// 执行所有订阅者的回调函数
this.events[event].forEach(callback => callback(data));
}
}
// 检查是否有订阅者
hasSubscribers(event) {
return this.events[event] && this.events[event].length > 0;
}
}
// 使用示例
const eventCenter = new PubSub();
// 订阅 'message' 事件
eventCenter.subscribe('message', (data) => {
console.log(`Message received: ${data}`);
});
// 订阅 'greet' 事件
eventCenter.subscribe('greet', (name) => {
console.log(`Hello, ${name}!`);
});
// 触发 'message' 事件
eventCenter.emit('message', 'Hello, Pub/Sub!');
// 触发 'greet' 事件
eventCenter.emit('greet', 'World');
// 取消对 'message' 事件的订阅
const myCallback = (data) => {
console.log(`My callback received: ${data}`);
};
eventCenter.subscribe('message', myCallback);
eventCenter.unsubscribe('message', myCallback);
// 再次触发 'message' 事件,myCallback 不会被调用
eventCenter.emit('message', 'This message will not be received by myCallback');
在这个例子中,PubSub
类提供了以下功能:
subscribe
方法允许订阅者注册一个回调函数到特定的事件。unsubscribe
方法允许订阅者从特定事件中注销其回调函数。unsubscribeAll
方法取消特定事件的所有订阅。emit
方法触发事件,执行所有订阅者的回调函数。hasSubscribers
方法检查特定事件是否有订阅者。