设计模式- 观察者模式(Observer Pattern)

定义

观察者模式(Observer Pattern): 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新

C#例子

    public interface ISubject {
        void AddObserver(Observer observer);
        void DeleteObserver(Observer observer);
    }
    public class Subject: ISubject
    {
        private IList<Observer> _observers = new List<Observer>();
        private int _qantity;
        public int Qantity
        {
            get
            {
                return _qantity;
            }
            set
            {
                _qantity = value;
                this.NotifyAllObservers();
            }
        }
        public void AddObserver(Observer observer) {
            _observers.Add(observer);
        }

        public void DeleteObserver(Observer observer)
        {
            _observers.Remove(observer);
        }

        private void NotifyAllObservers() {
            foreach (var observer in _observers) {
                observer.Update();
            }
        }
    }

    public abstract class Observer
    {
        protected Subject _subject;
        public abstract void Update();
    }

    public class ObserverA : Observer
    {
        public override void Update()
        {
            Console.WriteLine("我是A,我知道你的数量改变了!");
        }
    }
    public class ObserverB : Observer
    {
        public ObserverB(Subject subject)
        {
            _subject = subject;
        }
        public override void Update()
        {
            Console.WriteLine("我是B,我知道你的数量改变成了"+_subject.Qantity);
        }
    }

        static void Main(string[] args)
        {
            Subject subject = new Subject();
            subject.AddObserver(new ObserverA());
            subject.AddObserver(new ObserverB(subject));
            subject.Qantity = 10;
            Console.ReadLine();
        }

观察者模式参与者:

  • ISubject: 抽象的主题,被观察的对象,提供Attach和Detach Observer对象的接口
  • Subject: 具体的被观察对象,维持Subject状态。 当状态发生变化时,发送消息通知它的观察者。
  • Observer:抽象的观察者,定义一个发送变化通知更新的接口。
  • Observer*: 维持一个对Subject对象的引用, 保存subjects状态,实现当Observer接口发生变动时,subjects状态同步更新。

观察者模式适用情形:

  • 当一个抽象模型有两个方面,其中一方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
  • 当对一个对象的改变需要同时改变其他对象,而不需要知道具体有多少对象有待改变。
  • 当一个对象必须通知其他对象,而它又不需要知道其它的通知对象是谁,那些其它对象是谁不影响它发送通知这件事。

观察者模式特点:

  • 使用面向对象的抽象,Observer模式使得可以独立地改变目标与观察者,从而使二者之间的依赖关系达到松耦合。
  • 目标发送通知时,无需指定观察者,通知会自动传播。观察者自己决定是否需要订阅通知。
  • 在C#中的Event。委托充当了Observer接口,而提供事件的对象充当了目标对象,委托是比抽象Observer接口更为松耦合的设计。

其他

源码地址

dotnet-design-patterns

其他设计模式

23种设计模式

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券