انواع دیزاین پترن ها در #C (بخش چهارم)
انواع دیزاین پترن ها در #C (بخش چهارم)
قبل از خواندن این مقاله ابتدا مطالب پیش نیاز را مطالعه کنید:
-
الگوهای طراحی Design Pattern
-
انواع دیزاین پترن ها در #C (بخش اول)
-
انواع دیزاین پترن ها در #C (بخش دوم)
-
انواع دیزاین پترن ها در #C (بخش سوم)
انواع Design pattern ها در c#
انواع دیزاین پترن ها در #C (بخش چهارم)
قبل از خواندن این مقاله ابتدا مطالب پیش نیاز را مطالعه کنید:
-
الگوهای طراحی Design Pattern
-
انواع دیزاین پترن ها در #C (بخش اول)
-
انواع دیزاین پترن ها در #C (بخش دوم)
-
انواع دیزاین پترن ها در #C (بخش سوم)
انواع Design pattern ها در c#
-
دیزاین پترن Iterator | Iterator Design Pattern – C#
Iterator پترن یک روشی برای دسترسی مجموعه ای از اشیا هم جنس و پشت سر هم (مانند لیست پیوندی) است بدون آنکه درگیر جزییات (مانند نحوه اتصال اشیا به هم و ….) شویم.
دیزاین پترن Iterator یکی از معروف ترین و پراستفاده ترین الگوها در دات نت است.
این الگو راهی برای دسترسی به عناصر یک شیء بدون دانستن ساختار زیرین آن به صورت پیوسته فراهم می کند.
-
نمودار UML و پیاده سازی دیزاین پترن Iterator
کلاس ها، اینترفیس ها و اشیاء در نمودار کلاس UML بالا به شرح زیر هستند:
Client
یک کلاس است که شامل مجموعه ای از شیء است.
Iterator
یک رابط که عملیات برای دسترسی به اشیاء را در یک مجموعه تعریف می کند.
ConcreteIterator
یک کلاس است که رابط کاربری Iterator را اجرا می کند.
Aggregate
این یک رابط است که عملیات را برای ایجاد یک Iterator تعریف می کند.
ConcreteAggregate
یک کلاس است که رابط کاربری Aggregate را اجرا می کند.
public class Client
{
public void UseIterator()
{
ConcreteAggregate aggr = new ConcreteAggregate();
aggr.Add("One");
aggr.Add("Two");
aggr.Add("Three");
aggr.Add("Four");
aggr.Add("Five");
Iterator iterator = aggr.CreateIterator();
while (iterator.Next())
{
string item = (string)iterator.Current;
Console.WriteLine(item);
}
}
}
public interface Aggregate
{
Iterator CreateIterator();
}
public class ConcreteAggregate : Aggregate
{
private ArrayList items = new ArrayList();
public Iterator CreateIterator()
{
return new ConcreteIterator(this);
}
public object this[int index]
{
get { return items[index]; }
}
public int Count
{
get { return items.Count; }
}
public void Add(object o)
{
items.Add(o);
}
}
public interface Iterator
{
object Current { get; }
bool Next();
}
public class ConcreteIterator : Iterator
{
private ConcreteAggregate aggregate;
int index;
public ConcreteIterator(ConcreteAggregate aggregate)
{
this.aggregate = aggregate;
index = -1;
}
public bool Next()
{
index++;
return index < aggregate.Count;
}
public object Current
{
get
{
if (index < aggregate.Count)
return aggregate[index];
else
throw new InvalidOperationException();
}
}
}
مثال:
-
دیزاین پترن Mediator | Mediator Design Pattern – C#
این الگو اجازه می دهد که اشیاء چندگانه بدون دانستن ساختار یکدیگر با هم ارتباط برقرار کنند. این الگو یک شی را تعریف می کند که چگونه اشیا با یکدیگر تعامل کنند.
این الگو بیشتر برای کاهش پیچیدگی ارتباط بین کلاسها و اشیا استفاده میشود. یکی از مزایای این پترن کاهش وابستگی (Coupling) در ماژولهای مختلف برنامه است.
-
نمودار UML و پیاده سازی دیزاین پترن Mediator
کلاس ها، اینترفیس ها و اشیاء در نمودار کلاس UML بالا به شرح زیر هستند:
Mediator
یک رابط است که عملیات را تعریف می کند.
ConcreteMediator
یک کلاس است که عملیات ارتباطی Mediator را اجرا می کند.
Colleague
یک کلاس است که یک فیلد محافظت شده از Mediator را تعریف می کند.
ConcreteColleagueA/B
کلاس هایی هستند که از طریق Mediator با یکدیگر ارتباط برقرار می کنند.
public abstract class Colleague
{
protected IMediator _mediator;
public Colleague(IMediator mediator)
{
_mediator = mediator;
}
}
public class ConcreteColleagueA : Colleague
{
public ConcreteColleagueA(IMediator mediator) : base(mediator) { }
public void Send(string msg)
{
Console.WriteLine("A send message:" + msg);
_mediator.SendMessage(this, msg);
}
public void Receive(string msg)
{
Console.WriteLine("A receive message:" + msg);
}
}
public class ConcreteColleagueB : Colleague
{
public ConcreteColleagueB(IMediator mediator) : base(mediator) { }
public void Send(string msg)
{
Console.WriteLine("B send message:" + msg);
_mediator.SendMessage(this, msg);
}
public void Receive(string msg)
{
Console.WriteLine("B receive message:" + msg);
}
}
public interface IMediator
{
void SendMessage(Colleague caller, string msg);
}
public class ConcreteMediator : IMediator
{
public ConcreteColleagueA Colleague1 { get; set; }
public ConcreteColleagueB Colleague2 { get; set; }
public void SendMessage(Colleague caller, string msg)
{
if (caller == Colleague1)
Colleague2.Receive(msg);
else
Colleague1.Receive(msg);
}
}
مثال:
-
دیزاین پترن Memento | Memento Design Pattern – C#
این الگوریتم برای ضبط وضعیت فعلی یک شی و ذخیره آن به گونه ای است که می توان آن را در یک زمان بعد از شکستن قوانین کپسوله سازی بازگرداند. بعبارتی زمانی استفاده میشود که بخواهیم وضعیت یک شی را ذخیره کنیم تا بتوانیم آن را به حالت قبل بازگردانیم.
-
نمودار UML و پیاده سازی دیزاین پترن Memento
کلاس ها، اینترفیس ها و اشیاء در نمودار کلاس UML بالا به شرح زیر هستند:
Originator
یک کلاس است که با استفاده از عملیات SetMemento ، Originator را به وضعیت ذخیره شده قبلی بازمی گرداند.
Memento
یک کلاس که حاوی اطلاعاتی درباره حالت ذخیره شده Originator است.
Caretaker
این یک کلاس است که برای نگهداری یک شی Memento برای استفاده بعد استفاده می شود. این کلاس تنها به عنوان یک فروشگاه عمل می کند. هرگز محتویات شیء Memento را بررسی یا اصلاح نمی کند.
public class Originator
{
private string state;
public Memento CreateMemento()
{
return new Memento(state);
}
public void SetMemento(Memento memento)
{
this.state = memento.GetState();
}
}
public class Memento
{
private string state;
public Memento(string state)
{
this.state = state;
}
public string GetState()
{
return state;
}
}
public class Caretaker
{
public Memento Memento { get; set; }
}
مثال:
-
دیزاین پترن Observer | Observer Design Pattern – C#
این الگو زمانی استفاده می شود که بین اشیاء یک رابطه وجود دارد مانند اینکه اگر یک شیء اصلاح شود، اشیا وابسته به آن به طور خودکار مطلع می شوند.
اشیائی که منتظر اعلام تغییر وضعیت هستند را Observer میگویند و یک شی که به بقیه اشیا تغییر را اعلام میکند، Subject میگویند.
-
نمودار UML و پیاده سازی دیزاین پترن Observer
کلاس ها، اینترفیس ها و اشیاء در نمودار کلاس UML بالا به شرح زیر هستند:
Subject
یک شی که به بقیه اشیا تغییر را اعلام میکند.
ConcreteSubject
حالت اولیه تغییر را در خود نگه میدارد.
Observer
اشیائی که منتظر اعلام تغییر وضعیت هستند.
ConcreteObserver
یک کلاس است که رابط کاربری Observer را اجرا می کند و Subject را بررسی می کند تا مشخص شود کدام اطلاعات تغییر کرده است.
public abstract class Subject
{
private ArrayList observers = new ArrayList();
public void Attach(IObserver o)
{
observers.Add(o);
}
public void Detach(IObserver o)
{
observers.Remove(o);
}
public void Notify()
{
foreach (IObserver o in observers)
{
o.Update();
}
}
}
public class ConcreteSubject : Subject
{
private string state;
public string GetState()
{
return state;
}
public void SetState(string newState)
{
state = newState;
Notify();
}
}
public interface IObserver
{
void Update();
}
public class ConcreteObserver : IObserver
{
private ConcreteSubject subject;
public ConcreteObserver(ConcreteSubject sub)
{
subject = sub;
}
public void Update()
{
string subjectState = subject.GetState();
Console.WriteLine(subjectState);
}
}
مثال:
-
دیزاین پترن State | State Design Pattern – C#
این الگو زمانی استفاده می شود که ارتباط بین اشیاء بیش از یک ارتباط باشد، از جمله اگر یک شی تغییر یافته باشد، اشیا وابسته به آن به صورت اتوماتیک مطلع می شوند. این الگو برای تغییر رفتار یک شی در هنگام تغییر وضعیت داخلی مورد استفاده قرار می گیرد.
این الگو به عنوان یک نسخه پویا و پیشرفته از الگوی Strategy است.
-
نمودار UML و پیاده سازی دیزاین پترن State
کلاس ها، اینترفیس ها و اشیاء در نمودار کلاس UML بالا به شرح زیر هستند:
Context
یک کلاس که دارای یک شیء با حالت مشخص نسبت به حالت کنونی است. این کلاس توسط کلاینت مورد استفاده قرار می گیرد.
State
یک رابط است که توسط شی Object برای دسترسی به قابلیت تغییر پذیر استفاده می شود.
ConcreteStateA/B
کلاس هایی هستند که رابط کاربری را اجرا می کنند و قابلیت های واقعی را که توسط شیء Context استفاده می شود، ارائه می دهد.
public class Context
{
private IState state;
public Context(IState newstate)
{
state = newstate;
}
public void Request()
{
state.Handle(this);
}
public IState State
{
get { return state; }
set { state = value; }
}
}
public interface IState
{
void Handle(Context context);
}
public class ConcreteStateA : IState
{
public void Handle(Context context)
{
Console.WriteLine("Handle called from ConcreteStateA");
context.State = new ConcreteStateB();
}
}
public class ConcreteStateB : IState
{
public void Handle(Context context)
{
Console.WriteLine("Handle called from ConcreteStateB");
context.State = new ConcreteStateA();
}
}
مثال:
"منتشر شده در سایت ABLY"