前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式- 观察者模式(Observer Pattern)

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

作者头像
易兒善
发布2019-05-14 14:22:06
3910
发布2019-05-14 14:22:06
举报
文章被收录于专栏:挖坑填坑

定义

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

C#例子

代码语言:javascript
复制
    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种设计模式

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.05.03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 定义
  • C#例子
  • 观察者模式参与者:
  • 观察者模式适用情形:
  • 观察者模式特点:
  • 其他
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档