C# 设计模式 观察者模式示例

C# 设计模式 观察者模式示例_第1张图片

1.观察者(订阅者)接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Observer
{
    /// 
    /// 观察者接口
    /// 
    public interface IObserver
    {
        /// 
        /// 观察到事件 调用函数
        /// 
        void Update();
    }
}

2.主题抽象类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Observer
{
    /// 
    /// 主题
    /// 
    public class Subject
    {
        // 观察者列表
        private List<IObserver> observers = new List<IObserver>();

        /// 
        /// 添加观察者
        /// 
        /// 
        public void AddObserver(IObserver observer)
        {
            // 添加订阅者
            Console.WriteLine("----添加订阅者---");
            this.observers.Add(observer);
        }

        /// 
        /// 删除观察者
        /// 
        /// 
        public void DeleteObserver(IObserver observer)
        {
            // 删除订阅者
            this.observers.Remove(observer);
        }

        // 通知所有观察者
        public void NotifyObservers()
        {
            foreach (IObserver item in observers)
            {
                item.Update();
            }
        }

    }
}

3.具体主题类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Observer
{
    /// 
    /// 老板动作主题 发布者
    /// 
    public class BossConcreateSubject : Subject
    {

        public void DoSomething()
        {
            Console.WriteLine("......老板做些事情..........");
            Console.WriteLine("......老板视察工作..........");

            // 发布事件 通知订阅者
            this.NotifyObservers();
        }
    }
}

4、观察者A

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Observer
{
    public class ConcreateObserverA : IObserver
    {
        public void Update()
        {
            Console.WriteLine("观察者A -- 接受到事件");
        }
    }
}

5、观察者B

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Observer
{
    public class ConcreateObserverB : IObserver
    {
        public void Update()
        {
            Console.WriteLine("观察者B -- 接受到事件");
        }
    }
}

6、测试观察者模式

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Observer
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("---------------------观察者模式-----------------------");
            // 创建主题
            BossConcreateSubject bossConcreateSubject = new BossConcreateSubject();

            // 创建观察者
            ConcreateObserverA observerA = new ConcreateObserverA();
            ConcreateObserverB observerB = new ConcreateObserverB();

            Console.WriteLine("---------------------主题添加观察者-----------------------");
            bossConcreateSubject.AddObserver(observerA);
            bossConcreateSubject.AddObserver(observerB);

            Console.WriteLine("---------------------主题触发事件-----------------------");
            bossConcreateSubject.DoSomething();

            Console.ReadLine();

        }
    }
}

显示结果

C# 设计模式 观察者模式示例_第2张图片

优缺点:

优点:
1、降低目标(主题)与观察者之间的耦合关系、主题与观察者建立了触发机制。
2、观察者与被观察者都是 抽象耦合的。

缺点:
1、观察者与观察目标有循环依赖关系、触发它们之间的循环调用、可能会导致系统崩溃
2、因为触发是循环调用,如果观察者过多会花费很长时间。

你可能感兴趣的:(C#,c#,设计模式,观察者模式)