2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Suunnittelumallit ovat yleisiä ratkaisuja ohjelmistosuunnittelun yleisiin ongelmiin. Seuraavassa on joitain yleisiä suunnittelumalleja, jotka on jaettu kolmeen pääluokkaan: luomismallit, rakennemallit ja käyttäytymismallit.
Nämä mallit tarjoavat mekanismeja objektien luomiseen, mikä lisää olemassa olevan koodin joustavuutta ja uudelleenkäytettävyyttä.
Singleton kuvio:
Tehdasmenetelmämalli:
Abstract Factory Pattern (Abstract Factory):
Rakennuskuvio (Builder):
Prototyyppi:
Nämä mallit käsittelevät objektien yhdistelmiä tai objektien ja niiden välisiä suhteita.
Sovitintila:
Sisustuskuvio (Decorator):
Välityspalvelintila (välityspalvelin):
Julkisivu:
Siltatila (silta):
Komposiittitila:
Flyweight-tila:
Nämä mallit keskittyvät objektien väliseen kommunikaatioon eli siihen, miten objektit ovat vuorovaikutuksessa ja jakavat vastuut.
strategia:
Mallimenetelmämalli (mallimenetelmä):
Tarkkailijakuvio (tarkkailija):
Iteraattorikuvio (Iteraattori):
Vastuuketjun malli:
Komentotila (komento):
Muistotila:
Tilan tila:
Vierailijatila:
Välittäjämalli:
Tulkkitila (tulkki):
Viime haastattelussa minulta kysyttiin koodin käyttämisestä tilaaja-julkaisija-mallin toteuttamiseen. Minulla oli aikaa simuloida näitä suunnittelumalleja js-koodilla.
Esimerkiksi
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');
Tässä esimerkissäPubSub
Luokka tarjoaa seuraavat toiminnot:
subscribe
Menetelmän avulla tilaajat voivat rekisteröidä takaisinsoittotoiminnon tiettyyn tapahtumaan.unsubscribe
Menetelmän avulla tilaajat voivat poistaa takaisinsoittotoimintojensa rekisteröinnin tietyistä tapahtumista.unsubscribeAll
Menetelmä peruuttaa kaikki tietyn tapahtuman tilaukset.emit
Menetelmä laukaisee tapahtuman ja suorittaa kaikkien tilaajien takaisinsoittotoiminnot.hasSubscribers
Menetelmä tarkistaa, onko tietylle tapahtumalle tilaajia.