نویسنده: behrouz

Adapter Pattern

Adapter Pattern:

الگوی سازگارساز (وفق دهنده، مبدل، Adapter Pattern)، الگوی است که در دنیا واقعی نمونه های زیادی از این الگو وجود دارد و به همین خاطر درک این الگو زیاد مشکل نخواهد بود.

شکل زیر را در نظر بگیرید و فرض کنید که کامپیوتر laptop شما دارای دو شاخه ای به شکل زیر است ولی پریز های برقی که در دیوار نصب شده است به شکلی است که در سمت چپ تصویر نشان داده شده است. شما برای استفاده از لپ تاپ خود در این محل چه کاری را انجام می دهید؟

شما می توانید برای حل این مشکل از یک مبدل استفاده کنید. که بین دو شاخه، لپ تاپ شما و پریز برق قرار می گیرد و شما می توانید با قرار دادن دو شاخه در مبدل و زدن مبدل به پریز از برق استفاده کنید. در واقع مبدل، اینترفیس پریز را به گونه ای تغییر می دهد که با اینترفیسی که لپ تاپ شما نیاز دارد همخوانی داشته باشد.

مثال بالا یک مثال از دنیا واقعی بود. ولی یک وفق دهنده شی گرا چست؟ وفق دهنده های شی گرا دقیقا کار مشابهی را انجام می دهند. آنها یک اینترفیس را به گونه ای تغییر می دهند که سرویس گیرنده ها انتظار آنرا دارند.

وفق دهند های شی گرا:

فرض کنید که شما یک سیستم نرم افزاری دارید که نیاز دارد با کتابخانه ی از کلاس های جدید که مربوط به فروشندگان است کار کند، اما کلاس های جدید به گونه ای طراحی شده اند که اینترفیس متفاوتی را نسبت به اینترفیس قبلی دارند.

برای حل این مشکل شما چیکار می کنید؟ می توانید سیستم نرم افزاری موجود را به گونه ای باز نویسی کنید که با کلاس هاس جدید همخوانی داشته باشد. یا کلاس های جدید را به گونه ای تغییر می دهید که با سیستم موجود همخوانی داشته باشد. اما آیا راه حل کم هزینه تری وجود ندارد که بدون تغییر هیچ کدام از سیستم ها، سیستم کار خود را انجام دهد. شما می توانید یک کلاس بنویسید که اینترفیس فروشندگان را به گونه ای تغییر بدهد که سیستم موجود انتظار دارد.

 

 

Adapter(سازگار ساز، وفق دهنده) مانند یک واسطه عمل می کند و درخواست های را که از سیستم موجود می رسد دریافت می کند و آنها را به شکلی تغییر می دهد و برای کلاس مورد نظر در سیستم فروشندگان ارسال می کند که قابل درک و اجرا برای آن کلاس باشد.

 

برای نمونه در شکل بالا کلاس کلاینت متدی به نام Max را که در اینترفیس Math1 تعریف شده است را نیاز دارد. ولی کلاس های که این اینترفیس را پیاده سازی می کنند. عملی را که کلاس کلاینت در نظر دارد انجام نمی دهند. ولی اینترفیس Math2 دارای عملی به نام Maxvalue است که توسط کلاس Imp2 پیاده سازی شده است و دقیقا خواسته کلاس کلاینت را انجام می دهد ولی با یک اینترفیس دیگر. برای حل این مشکل چه پیشنهادی دارید؟

برای حل این مشکل ما از یک مبدل (Adapter)، استفاده می کنیم. یعنی یک کلاس جدید تعریف می کنیم که اینترفیسی را که کلاس کلاینت می شناسد پیاده سازی می کند. ولی عمل Max را طوری سر بار گذاری می کنیم که وقتی آن فراخوانی می شود. عمل Maxvalue از کلاس Imp2 را فراخوانی کند.

 

 

نمودار کلاس Adapter:

نمودار کلاس الگو به صورت زیر است:

 

 

 

ستایش …

بهترین بخش را در هر فرد بجوی، و این را به او بگو. همه ما به چنین محرکی نیازمندیم، هر بار که از کار من ستایش می شود، فروتن می شوم، چون احساس نادیده گرفته شدن یا نا خوشایند بودن نمی کنم.

تمام مردم جهان چیزی دارند که به خاطر آن سزوار ستایش باشند. ستایش ها نشانه ادراک هستند. در خلوت خویش انسان هایی عالی هستیم، و هیچ کسی از دیگری بهتر نیست، نگریستن به عظمت همسایه ات را بیاموز، و عظمت خودت را نیز بنگر.

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

الگوی Façade (نما)

الگوی Façade (نما):

الگوی نما در سیستم های استفاده می شود که توسعه دهندگان می خواهند پیچیدگی یک سیستم را در یک کلاس (در بعضی مواقع چند کلاس) مخفی کنند و با استفاده از این کلاس و یا کلاس ها به عنوان واسط و میانجی، پیچیدگی سیستم را کاهش دهند.

اگر زیر سیستمی حاوی چند کلاس باشد و این کلاس ها با همدیگر همکاری کنند تا سرویس های را که قرار است زیر سیستم ارائه دهد را تداراک ببینند، ریسکی در ایجاد واسط به آن زیر سیستم وجود دارد. هر کلاس ممکن است چندین عملیات داشته باشد. زیر سیستم های دیگر باید  توانایی ارسال پیام به نمونه هایی از هر کلاس را داشته باشند. به این ترتیب، یک اتصال قوی بین زیر سیستم ها به وجود می آید و اگر تغییر در کلاس های یک زیر سیستم ارائه دهنده سرویس بوجود بیاید، نیازمند ردیابی تمامی مکان ها در زیر سیستم های هستیم که عملیات این کلاس ها را فراخوانی کرده اند.

یک روش غلبه بر این وضعیت، ایجاد کلاس façade می باشد، که واسطی را به زیر سیستم ایجاد می کند و این کلاس به عنوان نماینده زیرسیستم مورد نظر با زیر سیستم های دیگر عمل می کند. به این ترتیب، تغییر در پیاده سازی کلاس های زیر سیستم اثر محدودی بر زیر سیستم های دیگر دارد. و اگر تغییری در کلاس ها صورت بگیرد، فقط لازم است نقاطی در زیر سیستم های دیگر پیدا شود که در آنها، پیامی به نمونه های از کلاس façade ارسال شده است.

حالا با بررسی چند مثال می توانیم تصویری بهتری از این الگو به دست بیاوریم.

تصور کنید شما به عنوان مدیر پروژه برای یک پروژه نسبتا بزرگ انتخاب شده اید. در حالت اول شما خودتان وظیفه دارید مسئولیت تک و تک افراد پروژه را به آنها بگوید و وظایف واگذر شده به آنها را تحویل بگیرید. در این حالت شما وظیفه دارید با تک و تک افراد ارتباط برقرار کنید و همچنین برای بازخواست وظایف شما باید نحوه ارتباط این افراد را با یکدیگر بدانید. در حالت دوم یک نفر به عنوان سر گروه انتخاب می شود و شما مسئولیت ها واگذر شده را به او اعلام می کنید و برای تحویل وظایف فقط از او بازخواست می کنید. حالا دو حالت را باهم مقایسه کنید در کدام حالت پیچیدگی و حجم کاری شما کم است؟ البته که حالت دوم. در حالت دوم در واقع ما از الگوی façade استفاده کردیم. سر گروه در این حالت به عنوان کلاس façade است.

برای مثال دوم در نظر بگیرید شما مسئول طراحی یک فروشگاه الکترونیکی هستید که در آن مشتری باید قادر باشد برای پرداخت مبلغ خرید خود از کارت های اعتباری استفاده کند. شما به یکی از شرکت های صادر کننده کارت اعتباری مراجعه می کنید و می خواهید نحوه استفاده و موارد مورد نیاز برای اینکار را به شما ارائه دهد. شرکت مورد نظر هیچ وقت ساختار و کلاس های مورد نظر را که در داخل برنامه خود برای اینکارها استفاده می کنند دقیقا به شما ارائه نمی دهد. چون این نه به نفع شرکت مورد نظر است نه به نفع شما، چون با این کار  پیچیدگی سیستم پرداخت دقیقا به برنامه شما نیز اضافه خواهد شد. پس چاره کار چیست؟ استفاده از کلاس façade. شرکت مورد نظر یک کلاس façade را به عنوان میانجی بین برنامه شما و برنامه سیستم پرداخت خودشان طراحی و در اختیار مشتریان خود قرار می دهند و شما پیام های خود را به این کلاس ارسال می کند و آن نیز برای گرفتن و ارسال پاسخ به شما، پیام مورد نظر را به کلاس اصلی ارسال می کند و پاسخ را از آن دریافت و به شما ارسال می کند.

برای مثال آخر فرض کنید شما وظیفه دارید یک برنامه برای ایجاد و ارسال ایمیل بنویسید کلاس های که ممکن است برای اینکار در نظر بگیرید می تواند به صورت شکل زیر باشد.

·         کلاس MessageBody: این کلاس شامل بدنه پیام خواهد بود.

·         کلاس Attachment: این کلاس نمونه سازی می شود تا یک کلاس MessageBody در صورت نیاز شامل فایل پیوست باشد.

·         کلاس MessageHeader: این کلاس نمونه سازی می شود تا شامل اطلاعات سرآیند فایل باشد مانند From,To,Subject,….

·         کلاس Message: این کلاس نمونه سازی می شود تا دو کلاس MessageBody و MessageHeader را به هم متصل کند (پیوند بزند).

·         کلاس Security: این کلاس نمونه سازی می شود تا در صورت نیاز پیام ارسالی رمز گذاری شود.

·         کلاس MessageSender: این کلاس نونه سازی می شود تا در آخر پیام مورد نظر را به سرور مربوطه ارسال کند.

شکل زیر نمودار کلاس های بالا را همراه با ارتباطات آنها نشان می دهد.

 

 

 

با مشاهده تصویر بالا می تواند حدس بزند که کار با کلاس های که برای اینکار در نظر گرفته اید، کلاس client را می تواند بیش از حد پیچیده کند. برای استفاده از این کلاس ها، کلاس کلاینت باید با این 6 کلاس و همچنین باید با روابط بین آنها آشنا باشد. دوباره برای کاهش پیچیدگی می توانیم از الگوی façade استفاده کنیم یعنی برای کاهش پیچیدگی از یک کلاس جدید اتفاده می کنیم. طرح جدید می تواند به شکل زیر باشد.

 

 

نمودار کلاس الگوی نما:

نمودار کلاس الگو به صورت زیر می باشد.

اجزاء تشکیل دهنده الگو:

 

کلاس ها و اشیاء تشکیل دهنده این الگو عبارتند از:

·         کلاس façade :

  • این کلاس می داند که کلاس های زیر سیستم باید به پیام دریافت شده پاسخ دهند.
  • پیام های دریافت شده را به شی مناسب برای پاسخگوئی ارسال می کند.

·         کلاس های زیر سیستم:

  • کلاس های زیر سیستم از وجود کلاس façade آگاه نیستند.
  • به پیام های ارسال شده توسط کلاس façade پاسخ می دهند.

توجیه برای …

ما نیازی به توجیه عشق نداریم ؛ عشق یا هست یا نیست . عشق واقعی پذیرش دیگران است همان طور که هستند ، بدون تلاش برای تغییر دادنشان . اگر بکوشیم آنها تغییر دهیم ، یعنی واقعاً دوستشان نداریم . مسلما اگر شما تصمیم دارید با کسی زندگی کنید ، اگر این توافق را می کنید ، همیشه بهتر است با کسی توافق کنید که دقیقا همان طوری است که شما می خواهید . کسی را پیدا کنید که اصلا نیازی به تغییر نداشته باشد . خیلی آسان تر است که کسی را پیدا کنید که هم اکنون همان طور است که شما می خواهید ، تا این که سعی کنید او را عوض کنید . همچنین طرف مقابل باید شما را همان طور که هستید دوست داشته باشد . در این صورت نیازی نیست که شما را عوض کند . اگر دیگران احساس می کنند که باید شما را عوض کنند ، یعنی این که آنها واقعاً شما را آن گونه که هستید دوست ندارند . چرا با کسی بمانیم که ما را آن طور که هستیم نمی خواهد ؟

Factory Patterns (قسمت اول)

مفهوم Factory (کارخانه)، دقیقا از معنی لغوی آن مشخص است. کارخانه مکانی است که در آن کالاها و محصولاتی تولید می شود. و در بحث الگوهای طراحی، یک Factory کلاسی است که نمونه های از کلاس های دیگر را با توجه به پارامترهای که برای آن ارسال می شود، ایجاد می کند.

برای ایجاد یک ذهنیت در خودتان می توانید تصور کنید که ما یک فروشگاه پوشاک داریم هر وقت که فروشگاه به لباس خاصی نیاز داشته باشید. اسامی آن را به تولید کننده(Factory) ارسال می کند و تولید کننده با توجه به اسامی ارسال شده آن لباس ها را تولید کرده و به فروشگاه ارسال می کند. در این مثال تولید کننده همان کلاس Factory ما است که با توجه به پارامترهای ارسال شده (لیست پوشاک مورد نظر فروشگاه) لباس مورد نظر (شی موزد نظر) را تولید می کند و به مشتری ارسال می کند.

نمونه کد اول در VB.NET

‘Class Shirt

Public Class Shirt

Protected _Color As String

Protected _Size As String

Public ReadOnly Property Color()

Get

Return _Color

End Get

End Property

Public ReadOnly Property Size()

Get

Return _Size

End Get

End Property

End Class

‘Class Shrit_A

Public Class Shrit_A

Inherits Shirt

Public Sub New()

Me._Color = “Blue”

Me._Size = “XL”

End Sub

End Class

‘Class Shrit_B

Public Class Shirt_B

Inherits Shirt

Public Sub New()

Me._Color = “Red”

Me._Size = “M”

End Sub

End Class

‘Class Factory

Public Class Factory

Public Function GetShirt(ByVal Type As String) As Shirt

If Type = “A” Then

Return New Shrit_A()

Else

Return New Shirt_B()

End If

End Function

End Class

‘Class Store

Public Class Store

Private _OrderType As String

Public Property OrderType()

Get

Return _OrderType

End Get

Set(ByVal value)

_OrderType = value

End Set

End Property

Public Function Order() As Shirt

Dim Ins1 As New Factory

Dim Ins2 As Shirt = Ins1.GetShirt(_OrderType)

Return Ins2

End Function

End Class

نحوه استفاده

Private Sub Cmd_Order_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

Dim Ins1 As New Store

Dim INs2 As New Shirt

Ins1.OrderType = “A”

INs2 = Ins1.Order()

End Sub

حقیقت

سر سپردن به حقیقت یعنی اینکه «من به هیچ سنتی تعلق نخواهم داشت. فقط جست و جو خواهم کرد. فقط زمان باور خواهم کرد که خود بدانم نه قبل از آن»

مسئله، رفتن به بهشت نیست. آموختن هنر در بهشت بودن است در هر جا که باشی. باید عصاره ی لحظه ی اکنون را برگرفت.

فقط عصیانگران می دانند زندگی چست و خدا چیست. زیرا خدا هسته زندگی است. در حقیقت، خدا و زندگی مترداف هم اند.

اشو

Singleton Pattern

Singleton Pattern:

اشیاء زیادی وجود دارند که ما فقط و فقط به یک نمونه آن از اشیاء نیاز داریم. برای مثال سیستم شما فقط می تواند فقط یک نمونه از پورت COM1 را داشته باشید یا در اداره شما فقط می تواند یک مدیر عامل وجود داشته باشد و …. حال فرض کنید که شما کلاسی دارید که فقط باید یک نمونه از آن ایجاد شود. شما این مسئله را چگونه حل می کنید؟

Singleton Pattern، الگوی است که برای اینکار ایجاد شده است. یعنی اطمینان از اینکه از کلاس ما فقط یک نمونه ایجاد شده است. این الگو برای این به کار می رود تا ایجاد نمونه از یک کلاس را محدود کند.

 

نحوه پیادسازی:

آسانترین راه برای ایجاد کلاسی که فقط می تواند یک نمونه از آن ایجاد شود استفاده از یک متغییر استاتیک در داخل کلاس می باشد. اولین نمونه ای که از این کلاس ایجاد می شود ما متغییر استاتیک را مقدار True می دهیم و در سایر دفعات این متغییر استاتیک در سازنده تست می شود  اگر مقدارش False باشد یک نمونه از شی ایجاد خواهد شد در غیر این صورت نمونه جدیدی از آن شی ایجاد نخواهد شد.

 

نمونه کد اول در VB.NET

تعریف کلاس

Public Class Singleton

    Private Shared instance_flag As Boolean = False

    Private _Id As Integer

 

    Public Property Id() As Integer

        Get

            Return _Id

        End Get

        Set(ByVal value As Integer)

            _Id = value

        End Set

    End Property

 

    Public Shared Function GetInstance() As Singleton

        If (Not instance_flag) Then

            instance_flag = True

            Return New Singleton

        Else

            Return Nothing

        End If

    End Function

 

End Class

نحوه استفاده

        Dim Ins1, Ins2 As Singleton

        Ins1 = Singleton.GetInstance

        Ins2 = Singleton.GetInstance

        Ins1.Id = 200

 

        Console.WriteLine(Ins1.Id)

        Console.WriteLine(Ins2.Id)

 

        Ins2.Id = 123

        Console.WriteLine(Ins1.Id)

        Console.WriteLine(Ins2.Id)

 

        Console.ReadKey()

خروجی: هنگام استفاده از کلاس بالا به شیوه ای که نوشته شد نمونه دوم از آن هیچ وقت ایجاد نخواهد شد پس تمام عملیاتی که نمونه دوم می خواهد انجام دهد با خطا همراه خواهد بود. برای حل این مشکل می توانیم به صورت زیر عمل کنیم.

 

 

نمونه کد دوم در VB.NET

تعریف کلاس

Public Class Singleton

    Shared m_instance As Singleton

    Private _Id As String

    Public Property Id() As Integer

        Get

            Return _Id

        End Get

        Set(ByVal value As Integer)

            _Id = value

        End Set

    End Property

    Public Shared Function GetInstance() As Singleton

        If (m_instance Is Nothing) Then

            m_instance = New Singleton()

        End If

        Return (m_instance)

    End Function

 

    Private Sub New()

    End Sub

End Class

نحوه استفاده

        Dim Ins1, Ins2 As Singleton

        Ins1 = Singleton.GetInstance

        Ins2 = Singleton.GetInstance

        Ins1.Id = 200

 

        Console.WriteLine(Ins1.Id)

        Console.WriteLine(Ins2.Id)

 

        Ins2.Id = 123

        Console.WriteLine(Ins1.Id)

        Console.WriteLine(Ins2.Id)

 

        Console.ReadKey()

خروجی:

       

200

200

123

123

 

برای من …

و تو تنهاترین «من» بودی.

و تو نزدیگ ترین «من» بودی.

و تو رساترین من بودی، ای «من» سحرگاهی، پنجرهای بر خیرگی دنیاها سر انگیز.

 

نگاه مرد مسافر به روی میز افتاد:

«چه سیب های قشنگی!

حیات نئشه تنهایی است.»

و میزبان پرسید:

قشنگ یعنی چه؟

– قشنگ یعنی تعبیر عاشقانه اشکال

و عشق، تنها عشق

ترا به گرمی یک سیب می کند مانوس.

و عشق، تنها عشق

مرا به وسعت اندوه زندگی ها برد،

مرا رساند به امکان یک پرنده شدن.

به فکر باشید

من چيزی آموختم که به هنگام مرگ در مورد همگان صادق است:
احساس لطيف شما چه مفهومی دارد
اگر برون فکنی نکنيد؟
ثمر دانش شما چيست
اگر بار و بر ندهد؟
[ … ]
به شما می گويم:
قبل از ترک جهان به فکر باشيد.
که نيک بودن به تنهايي کارساز نيست
بلکه بايد دنيائی زيباتر ساخت و آنگاه ترکش کرد.

                                           برتولت برشت