سناریویی وجود دارد که در آن شما میخواهید تنها یک کار را انجام دهید، ولی برای انجام آن n روش وجود دارد. برای مثال قصد مرتب سازی دارید و برای اینکار روشهای مختلفی وجود دارند. برای حل این مساله پیشتر از الگوی طراحی استراتژی استفاده نمودیم.( مطالعه بیشتر در مورد الگوی طراحی استراتژی ) حال به سناریویی برخورد کردیم که بصورت زیر است: میخواهیم یک کار را انجام دهیم ولی برای انجام این کار تنها برخی بخشهای کار با هم متفاوت هستند. برای مثال قصد ...
قبل از مطالعهی این مطلب، حتما الگوی طراحی Factory Method را مطالعه نمایید. همانطور که در الگوی طراحی Factory Method مشاهده شد، این الگو یک عیب دارد، آن هم این است که از کدام Creator باید استفاده شود و مستقیما در کد بایستی ذکر شود. class ConcreteCreator : Creator
{
public override IProduct FactoryMethod(string type)
{
switch (type)
{
case "A": return new Concrete ...
سناریوی زیر را در نظر بگیرید: فرض کنید از شما خواسته شده است تا یک پردازشگر متن را بنویسید. خوب در این پردازشگر با یکسری کاراکتر روبرو هستید که هر کاراکتر احتمالا آبجکتی از نوع کلاس خود میباشد؛ برای مثال آبجکت XYZ که آبجکتی از نوع کلاس A هست و برای نمایش کاراکتر A استفاده میشود. این آبجکتها دارای دو دسته خصیصه هستند: ( مطالعه بیشتر ) خصیصههای ثابت: یعنی همه کاراکترهای A دارای یک شکل مشخص هستند. در واقع مشخصات ذاتی آبجکت میبا ...
فرض کنید در حال پختن یک کیک هستید. ابتدا کیک را میپذید و سپس آن را تزیین میکنید. عملیات پختن کیک، فرآیند ثابتی است و تزیین کردن آن متفاوت. گاهی کیک را با کاکائو تزیین میکنید و گاهی با میوه و غیره. پیش از اینکه سناریو را بیش از این جلو ببریم، وارد بحث کد میشویم. طبق سناریوی فوق، فرض کنید کلاسی بنام Prototype دارید که این کلاس هم از کلاس انتزاعی APrototype ارث برده است. در ادامه یک شیء از این کلاس میسازید و مقادیر مختلف آن را تنظیم کرد ...
این بار مثال را با شیرینی و کیک پیش میبریم. فرض کنید شما قصد پخت کیک و نان را دارید. طبیعی است که برای اینکار یک واسط را تعریف کرده و عمل «پختن» را در آن اعلام میکنید تا هر کلاسی که قصد پیاده سازی این واسط را داشت، «پختن» را انجام دهد. در ادامه یک کلاس بنام کیک ایجاد خواهید کرد و شروع به پخت آن میکنید. خوب احتمالا الان کیک آمادهاست و میتوانید آنرا میل کنید! ولی یک سؤال. تکلیف شخصی که کیک با روکش کاکائو دوست دارد و شمایی که کیک با ر ...
سناریو زیر را در نظر بگیرید: قصد دارید تا در برنامهی خود ارسال پیام از طریق پیامک و ایمیل را راه اندازی کنید. هر کدام از این روشها نیز برای خود راههای متفاوتی دارند. برای مثال ارسال پیامک از طریق وب سرویس یا یک API خارجی و غیره. کاری را که میتوان انجام داد، بشرح زیر نیز میتوان بیان نمود: ابتدا یک Interface ایجاد میکنیم (IBridge) و در آن متد Send را قرار میدهیم. این متد یک پارامتر ورودی از نوع رشته میگیرد و به کمک آن میتوان اقدا ...
سناریوی زیر را در نظر بگیرید: از شما خواسته شده است تا نحوهی ساخت تلفن همراه را پیاده سازی نمایید. شما در گام اول 2 نوع تلفن همراه را شناسایی نمودهاید (Android و Windows Phone). پس از شناسایی، احتمالا هر کدام از این انواع را یک کلاس در نظر میگیرید و به کمک یک واسط یا کلاس انتزاعی، شروع به ساخت کلاس مینمایید، تا در آینده اگر تلفن همراه جدیدی شناسایی شد، راحتتر بتوان آن را در پیاده سازی دخیل نمود. اگر چنین فکر کرده اید باید گفت که 90% ...
اگر با الگوهای طراحی آشنا باشید، یکی از مناسبترین الگوهای طراحی برای پیاده سازی عملیات Undo و Redo استفاده از الگوی طراحی Command هست ( مطالعه بیشتر ). در این الگو یک کلاینت دارم که مشخص میکند چه کاری قرار است انجام شود. یک Command داریم که میگوید هر کاری را چه کسی انجام دهد و یک Receiver داریم که میگوید هر کاری چطور انجام میشود. قدم اول: کلاینت میخواهد عملیات Undo و Redo انجام شود. من اضافهبر این دو عملیات، عملیات Execute را ه ...
فرض کنید قبلا کلاسی بنام CollectionClass را داشتهاید که در آن یک آرایه از نوع []String تعریف کردهاید. همچنین n تا کلاس هم دارید که از آرایهی تعریف شدهی در CollectionClass استفاده میکنند. تا اینجا مشکلی نیست. مشکل زمانی شروع میشود که متوجه میشوید دیگر این آرایه کارآیی ندارد و باید آن را با <List<string جایگزین کنید. واضح است که نمیتوانید همه کلاسهایی را که از CollectionClass استفاده کردهاند، بیابید و آنها را تغییر دهید؛ چرا ...