انواع دیزاین پترن ها در #C (بخش چهارم)

انواع دیزاین پترن ها در #C (بخش چهارم)

انواع دیزاین پترن ها در #C (بخش چهارم)

قبل از خواندن این مقاله ابتدا مطالب پیش نیاز را مطالعه کنید:

انواع Design pattern ها در c#

why-use-design-pattern

انواع دیزاین پترن ها در #C (بخش چهارم)

قبل از خواندن این مقاله ابتدا مطالب پیش نیاز را مطالعه کنید:

انواع Design pattern ها در c#

  • دیزاین پترن Iterator | Iterator Design Pattern – C#

Iterator پترن یک روشی برای دسترسی مجموعه ای از اشیا هم جنس و پشت سر هم (مانند لیست پیوندی) است بدون آنکه درگیر جزییات (مانند نحوه اتصال اشیا به هم و ….) شویم.

دیزاین پترن Iterator یکی از معروف ترین و پراستفاده ترین الگوها در دات نت است.

این الگو راهی برای دسترسی به عناصر یک شیء بدون دانستن ساختار زیرین آن به صورت پیوسته فراهم می کند.

  • نمودار UML و پیاده سازی دیزاین پترن Iterator

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();
 }
 }
}

مثال:

iterator-design-pattern

  • دیزاین پترن Mediator | Mediator Design Pattern – C#

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

این الگو بیشتر برای کاهش پیچیدگی ارتباط بین کلاس‌ها و اشیا استفاده می‌شود. یکی از مزایای این پترن کاهش وابستگی (Coupling) در ماژول‌های مختلف برنامه است.

  • نمودار UML و پیاده سازی دیزاین پترن Mediator

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);
 }
}

مثال:

mediator-design-pattern

  • دیزاین پترن Memento | Memento Design Pattern – C#

این الگوریتم برای ضبط وضعیت فعلی یک شی و ذخیره آن به گونه ای است که می توان آن را در یک زمان بعد از شکستن قوانین کپسوله سازی بازگرداند. بعبارتی زمانی استفاده می‌شود که بخواهیم وضعیت یک شی را ذخیره کنیم تا بتوانیم آن را به حالت قبل بازگردانیم.

  • نمودار UML و پیاده سازی دیزاین پترن Memento

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; }
}


مثال:

memento-design-pattern

  • دیزاین پترن Observer | Observer Design Pattern – C#

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

اشیائی که منتظر اعلام تغییر وضعیت هستند را Observer می‌گویند و یک شی که به بقیه اشیا  تغییر را اعلام می‌کند، Subject می‌گویند.

  • نمودار UML و پیاده سازی دیزاین پترن Observer

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);
 }
} 

مثال:

observer-design-pattern

  • دیزاین پترن State | State Design Pattern – C#

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

این الگو  به عنوان یک نسخه پویا و پیشرفته از الگوی Strategy است.

  • نمودار UML و پیاده سازی دیزاین پترن State

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();
 }
} 

مثال:

state-design-pattern

 

"منتشر شده در سایت ABLY"

نظرات یا سوالات خودرا با ما درمیان بگذارید

0912 097 5516 :شماره تماس
0713 625 1757 :شماره تماس