الگوی طراحی Interceptor

  • شماره مطلب : 5
  • دسته بندی : الگو های طراحی نرم افزار
  • عنوان : الگوی طراحی Interceptor
  • نویسنده : NetBoss
  • پیش نیاز : الگوهای طراحی نرم افزار

الگوی طراحی Interceptor هنگامی استفاده میشود که ما بخواهیم عملیاتی را قبل از پردازش و یا بعد از پردازش بر روی یک Request و یا Response انجام دهیم.  (pre-processing / post-processing).

در لغت Interceptor به معنای رهگیر میباشد. شاید از همین روست که این الگوی طراحی  Intercepting Filter نام گذاری شده است. یعنی به زبان ساده اگر بخواهیم الگوی طراحی Interceptor را شرح دهیم باید آن را به فیلتری بر سر راه Request و Response ها تشریح نماییم. این فیلتر های رهگیر قبل از رسیدن Request و یا Response به هدف (Target) آنها را در یافت نموده و عملیات مورد نظر خود را بر روی آنها انجام میدهند. سپس Request  و یا Response مورد نظر را به سمت Target مورد نظر هدایت مینمایند.  برای مثال عملیات های اهراز هویت، ثبت لاگ، Validation و غیره را میتوان از کار های Interceptor عنوان نمود.

برای پیاده سازی الگوی طراحی Interceptor میبایست چند مفهوم ساده را تعریف نماییم. اولین مفهوم Filter میباشد. فیلتر موجودتی است که قبل و یا بعد از اجرا شدن Request در Request handler  بر روی آن اعمال میشود.

دومین مفهوم Filter chain و یا زنجیره فیلترها میباشد. از آنجا که طبیعتا در محیط نرم افزار میتواند بیشتر از یک نوع فیلتر برای Request وجود داشته باشد،زنجیره فیلتر به ما کمک میکند که این توالی را به ترتیب بر روی Request اعمال نماییم.

سومین مفهوم Target و یا همان Request handler میباشد که نهایتا Request مورد نظر پس از عبور از فیلتر به آنجا جهت اجرا شدن ارسال میشود.

چهارمین مفهوم Filter Manger است که وظیفه مدریت فیلترها و زنجیره فیلتر را بر عهده دارد.

و نهایتا آخرین مفهوم Client است که Request را به Target ارسال مینماید.

دیاگرام زیر نحوه پیاده سازی الگوی طراحی Interceptor را برای دو فیلتر Validation و Log نشان میدهد. در این مثال Request قبل از رسیدن به هدف و اجرا شدن در دو فیلتر فوق پیش پردازش میشود.

الگوی طراحی Interceptor
برای وضوح بیشتر تصویر را در تب جداگانه ای مشاهده نمایید

نمایی از Interface فیلتر

public interface IFilter
{
void Pre_Process(string request);
}


نمایی از کلاس فیلتر لاگر

public class LogFilter:IFilter
{
public void Pre_Process(string request)
{
Thread.Sleep(1000);
Console.WriteLine("Request-{0} was logged in the system at {1}", request, DateTime.Now.ToLongTimeString());
}
}


نمایی از زنجیره فیلتر ها

public class FilterChain
{
private readonly Dictionary<int, IFilter> _filters;
private readonly Target _target;

public FilterChain()
{
_filters=new Dictionary<int, IFilter>();
_target=new Target();
}

public void AddToFilterList(IFilter filter)
{
var maxq = from f in _filters orderby f.Key descending select f.Key;
var maxId = maxq.FirstOrDefault();
var newId = maxId + 1;
_filters.Add(newId,filter);
}

public void ExecuteRequest(string request)
{
foreach (var item in _filters)
{
item.Value.Pre_Process(request);
}
_target.Excute(request);
}
}


نمایی از فیلتر Filter Manager

public class FilterManger
{
private readonly FilterChain _filterChain;

public FilterManger()
{
_filterChain=new FilterChain();
}

public void SetFilter(IFilter filter)
{
_filterChain.AddToFilterList(filter);
}

public void ExcuteRequest(string request)
{
_filterChain.ExecuteRequest(request);
}
}


نمایی از Target

public class Target
{
public void Excute(string request)
{
Thread.Sleep(2000);
Console.WriteLine("Request-{0} was excuted at {1}",request,DateTime.Now.ToLongTimeString());
}

}


نمایی از Client

class Program
{
static void Main(string[] args)
{
var filterManger=new FilterManger();
filterManger.SetFilter(new LogFilter());
filterManger.SetFilter(new ValidationFilter());
//
var request = "Rq.Number1";
filterManger.ExcuteRequest(request);
Console.ReadKey();
}
}


خروجی الگوی طراحی Interceptor

Request-Rq.Number1 was logged in the system at 9:17:55 AM
Request-Rq.Number1 was validated at 9:17:56 AM
Request-Rq.Number1 was excuted at 9:17:58 AM

Add a Comment

Your email address will not be published. Required fields are marked *

Copy Protected by Chetan's WP-Copyprotect.