الگوی زنجیره مسئولیت در TypeScript
الگوهای طراحی: الگوی زنجیره مسئولیت در TypeScript
الگوهای طراحی برای توسعه دهندگان وب بسیار مهم هستند و با تسلط بر آنها می توانیم کدهای بهتری بنویسیم. در این مقاله از TypeScript برای معرفی الگوی Chain of Responsibility استفاده می کنم.پس با ما در الگوی زنجیره مسئولیت در TypeScript همراه باشید
الگوی زنجیره مسئولیت راهی برای جلوگیری از جفت شدن بین فرستنده و گیرنده درخواست با دادن فرصت به چندین شیء برای رسیدگی به درخواست است. در الگوی زنجیره مسئولیت، بسیاری از اشیاء توسط یک مرجع از هر شی به شی بعدی خود متصل می شوند تا یک زنجیره تشکیل دهند. درخواست ها در طول زنجیره ارسال می شوند تا زمانی که یکی از اشیاء در زنجیره تصمیم به رسیدگی به درخواست بگیرد.
انجام پروژه در فریلنس پروژه
پست های مختلف در شرکت دارای مسئولیت ها و اختیارات متفاوتی هستند. به عنوان مثال روند خاموش شرکت ما را در نظر بگیرید، زمانی که من درخواست یک روز مرخصی می کنم، فقط باید توسط رهبر تیم تایید شود و نیازی به انتقال آن به سرپرست و مدیر نیست. اگر پیوندی در زنجیره مسئولیت نتواند درخواست فعلی را پردازش کند، اگر پیوند بعدی وجود داشته باشد، درخواست برای پردازش به لینک بعدی ارسال می شود.
در فرآیند توسعه نرم افزار، برای زنجیره مسئولیت، یک سناریوی کاربردی رایج میان افزار است. بیایید نگاهی به نحوه استفاده از زنجیره مسئولیت برای پردازش درخواست ها بیندازیم.
برای درک بهتر کد زیر، ابتدا به نمودار UML مربوطه نگاه می کنیم:

در شکل بالا یک رابط Handler تعریف می کنیم. دو روش زیر در این رابط تعریف شده است:
use(h: Handler): Handler => مورد استفاده برای ثبت handler (middleware)
get(url: string, callback: (data: any) => void): void => ثبت یک کنترل کننده درخواست دریافت
رابط هندلر
interface Handler {
use(h: Handler): Handler;
get(url: string, callback: (data: any) => void): void;
}
سپس یک کلاس AbstractHandler را تعریف می کنیم که منطق پردازش زنجیره مسئولیت را در بر می گیرد. یعنی کنترل کننده های مختلف را ترکیب کنید تا یک زنجیره مرجع تشکیل شود.
کلاس انتزاعی AbstractHandler
abstract class AbstractHandler implements Handler {
next!: Handler;
use(h: Handler) {
this.next = h;
return this.next;
} get(url: string, callback: (data: any) => void) {
if (this.next) {
return this.next.get(url, callback);
}
}
}
بر اساس کلاس AbstractHandler به ترتیب AuthMiddleware و LoggerMidddleware را تعریف می کنیم. میانافزار AuthMiddleware برای رسیدگی به احراز هویت کاربر و میانافزار LoggerMidddleware برای خروجی گزارشهای درخواست استفاده میشود.
کلاس AuthMiddleware
class AuthMiddleware extends AbstractHandler {
isAuthenticated: boolean;
constructor(username: string, password: string) {
super(); this.isAuthenticated = false;
if (username === "bytefer" && password === "666") {
this.isAuthenticated = true;
}
} get(url: string, callback: (data: any) => void) {
if (this.isAuthenticated) {
return super.get(url, callback);
} else {
throw new Error("Not Authorized");
}
}
}
کلاس LoggerMiddleware
class LoggerMiddleware extends AbstractHandler {
get(url: string, callback: (data: any) => void) {
console.log(`Request url is: ${url}`);
return super.get(url, callback);
}
}
با میان افزار AuthMiddleware و LoggerMidddleware، بیایید یک کلاس Route برای ثبت این میان افزارها تعریف کنیم.
کلاس مسیر
class Route extends AbstractHandler {
urlDataMap: { [key: string]: any };
constructor() {
super();
this.urlDataMap = {
"/api/todos": [
{ title: "Learn Design Pattern" },
],
"/api/random": () => Math.random(),
};
} get(url: string, callback: (data: any) => void) {
super.get(url, callback); if (this.urlDataMap.hasOwnProperty(url)) {
const value = this.urlDataMap[url];
const result = typeof value === "function" ? value() : value;
callback(result);
}
}
}
پس از تعریف کلاس Route، می توانیم از آن استفاده کرده و میان افزارها را به روش زیر ثبت کنیم:
const route = new Route();
route.use(new AuthMiddleware("bytefer", "666"))
.use(new LoggerMiddleware());route.get("/api/todos", (data) => {
console.log(JSON.stringify({ data }, null, 2));
});route.get("/api/random", (data) => {
console.log(data);
});
هنگامی که کد بالا را با موفقیت اجرا کردید، خروجی مربوطه ایجاد می شود:
در نهایت، اجازه دهید سناریوهای استفاده از الگوی زنجیره مسئولیت را خلاصه کنیم:
می خواهید بدون مشخص کردن صریح گیرنده، درخواستی را به یکی از چندین شیء ارسال کنید.
چندین شی وجود دارد که می تواند یک درخواست را مدیریت کند و اینکه کدام شیء درخواست را مدیریت می کند به طور خودکار در زمان اجرا تعیین می شود و مشتری فقط باید درخواست را به زنجیره ارسال کند.
اگر سوالی دارید، لطفا برای من پیام بگذارید. بعداً به معرفی الگوهای دیگر ادامه خواهم داد،


نظرات