Decorator pattern
اقا ما بر فرض مثال ما یه سرویسی داریم هعی به این سرویس چیزای جدید اضافه میکنیم کداش رو زیاد و شلوغ تر میکنیم مثلا چی مثلا logging , cache , metrics,authrization ,...
به جای اینکار دکوریتور رو میاریم وسط
که میگه :
بدون تغییر دادن ابجکت اصلی بهش قابلیت های جدید اضافه کن
پس برای هر قابلیت یه دکوریتور داریم
loggingDecorator
مثال
interface UserService {
getUser(id: string): Promise<User>;
}
class UserServiceImpl implements UserService {
async getUser(id: string): Promise<User> {
console.log("Fetching user from database");
return {
id,
name: "Amir",
};
}
}
class LoggingUserService implements UserService {
constructor(
private readonly service: UserService
) {}
async getUser(id: string): Promise<User> {
console.log(`Getting user: ${id}`);
const user = await this.service.getUser(id);
console.log(`User found: ${id}`);
return user;
}
استفاده :
const userService = new UserServiceImpl();
const loggedUserService =
new LoggingUserService(userService);
await loggedUserService.getUser("123");
اتفاقی که اینجا میوفته اینه که logging قبل و بعد از سرویس اصلی اجرا میشه
اینجا دکوریتورمون هم خودش یه یوزر سرویس هستش چون یوزر سرویس رو ایمپلمنت کرده
پس میتونیم چند لایه دکوریتور رو روی هم بزاریم
مثلا به یوزر سرویس بالا بیاییم یه دکوریتور برای کش اضافه کنیم :
class CacheUserService implements UserService {
constructor(
private readonly service: UserService
) {}
async getUser(id: string): Promise<User> {
const cached = await cache.get(id);
if (cached) {
return JSON.parse(cached);
}
const user = await this.service.getUser(id);
await cache.set(
id,
JSON.stringify(user)
);
return user;
}
}
فک کنم تا اینجا متوجه شده باشید که جریانش چطوریاست
ممنون
4 · 796 · MessageDecorator pattern
25 September 2026Nearby in the feed
Athis message
R