معرفی الگوی طراحی Observer

معرفی الگوی طراحی Observer

مدت مطالعه : 3 دقیقه

19 اردیبهشت 1402

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

الگوی طراحی Observer یک الگوی طراحی رفتاری(behavioral) است که یک شئ را به چند کلاس وابسته به آن متصل می‌کند. این الگو امکانی فراهم می‌کند که در زمان تغییر وضعیت یک شیء، اشیاء وابسته به آن به طور خودکار مطلع و به روز شوند. الگوی Observer زمانی مفید است که شما نیاز به حفظ ثبات بین اشیاء مرتبط بدون اتصال محکم(tightly coupling) آنها دارید.

 

الگوی Observer از اجزاء مختلفی تشکیل شده است:

  • Subject: شیئی است که وضعیت آن تغییر می کند و این تغییر توسط اشیاء وابسته، پیگیری می‌شود. این شئ فهرستی از اشیاء وابسته به خود را نگه می دارد و در صورت تغییر وضعیت، به آنها اطلاع می دهد.
  • Observer: متدی که Subject در حین تغییر وضعیت فراخوانی می‌کند، در این رابط تعریف می‌شود. 
  • Concrete Observer: این کلاسی است که رابط Observer را پیاده سازی می کند. این کلاس باید تنظیم کند که درصورت فراخوانی تغییر وضعیت از طریق Subject، چه تغییراتی در این کلاس رخ دهد.

در ادامه مثالی از نحوه پیاده سازی الگوی Observer در سی شارپ آورده شده است:

interface IObserver
{
    void Update();
}
class Subject
{
    private List<IObserver> observers = new List<IObserver>();
    private int state;
    public int State
    {
        get { return state; }
        set
        {
            state = value;
            Notify();
        }
    }
    public void Attach(IObserver observer)
    {
       observers.Add(observer);
    }
    public void Detach(IObserver observer)
    {
       observers.Remove(observer);
    }
    public void Notify()
    {
        foreach (IObserver observer in observers)
        {
           observer.Update();
        }
    }
}
class ConcreteObserver : IObserver
{
    private string name;
    private Subject subject;
    public ConcreteObserver(string name, Subject subject)
    {
        this.name = name;
        this.subject = subject;
    }
    public void Update()
    {
       Console.WriteLine("{0} has received an update: {1}", name, subject.State);
    }
}
class Program
{
    static void Main(string[] args)
    {
        Subject subject = new Subject();
        ConcreteObserver observer1 = new ConcreteObserver("Observer 1", subject);
        ConcreteObserver observer2 = new ConcreteObserver("Observer 2", subject);
       subject.Attach(observer1);
        subject.Attach(observer2);
        subject.State = 5;
       subject.Detach(observer2);
        subject.State = 10;
        Console.ReadKey();
    }
}

در مثال بالا، ما یک کلاس Subject داریم که دارای وضعیت قابل تغییر است. همچنین لیستی از اشیاء وابسته به آن دارید که باید در حین تغییر وضعیت، مطاع شوند. هنگامی که وضعیت Subject تغییر می کند، با فراخوانی متد Update همه Observer های متصل شده، این تغییرات را دریافت می‌کنند. کلاس های Observer متصل شده، هرکدام دارای دستوراتی اختصاصی هستند که در صورت دریافت بروزرسانی، آن ها را اعمال می‌کنند. 

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

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

design patterns

ایجاد کننده (Creational):الگوی طراحی Factory 
الگوی طراحی Builder 
الگوی طراحی Singleton 
الگوی طراحی Prototype 
الگوی طراحی Abstract Factory 
ساختاری (Structural):الگوی طراحی Adapter 
الگوی طراحی Bridge 
الگوی طراحی Composite 
الگوی طراحی Decorator 
الگوی طراحی Facade 
الگوی طراحی Flyweight 
الگوی طراحی Proxy 
رفتاری (Behavioral):الگوی طراحی Chain of Responsibility 
الگوی طراحی Command 
الگوی طراحی Interpreter 
الگوی طراحی Mediator 
الگوی طراحی Memento 
الگوی طراحی Observer 
الگوی طراحی State 
الگوی طراحی Strategy 
الگوی طراحی Template Method 
الگوی طراحی Visitor 
الگوی طراحی Iterator 
  • اشتراک گذاری:
محمدرضا باباخانی
محمدرضا باباخانی

من محمدرضا باباخانی هستم، توسعه دهنده نرم افزار. در اینجا تجربیات، نظرات و پیشنهادات خودم رو درباره تکنولوژی مینویسم. امیدوارم مطالبی که می‌نویسم بدردتون بخوره.

آخرین مطالب

سرویس مش؛ ساده سازی ارتباطات میکروسرویس و افزایش رؤیت پذیری

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

اهمیت محاسبات لبه یا Edge Computing

ا توجه به سرعت تحول فناوری، یکی از مفاهیمی که توجه زیادی را به خود جلب کرده و نحوه تعامل ما با سیستم های دیجیتال را تغییر می دهد، محاسبات لبه (Edge Computing) است.

معماری رویداد محور چیست؟

معماری رویداد محور (EDA) یک الگوی طراحی نرم افزار است که در توسعه نرم افزار های مدرن به طور چشمگیری محبوب شده است. در این معماری، جریان داده ها با وقوع رویدادها تعیین می شود. بر خلاف سیستم های متمرکز سنتی که دائماً در حال بررسی وضعیت جدید هستند. معماری رویداد محور به ویژه برای سیستم هایی مفید است که به پردازش حجم زیادی از داده ها بصورت بلادرنگ(real-time) نیاز دارند.

ثبت دیدگاه