老师来了——观察者模式

本文介绍了观察者模式,又称发布-订阅模式,通过类比历史和高中生活场景来阐述其概念。文章指出,观察者模式用于一对多的依赖关系,当主题对象状态变化时,会通知所有观察者进行更新。接着讨论了使用观察者模式的目的,即解耦合,遵循依赖倒转原则。最后,作者分享了高中时期的趣事,将观察者模式应用到与老师的互动中。
摘要由CSDN通过智能技术生成

敲完观察者模式后,有一种回到高中的感觉,为什么呢?接下来由我为大家细细道来。

本文章要告诉大家的知识:

       1.什么是观察者模式

       2.为什么要用观察者模式(好处)

       3.我的高中生活

       


首先让我们来说道说道什么是观察者模式。

       观察者模式:又叫发布-订阅模式。定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时候,会通知所有的观察者对象,使它们能够自动的更新自己。

       一些通俗的理解就是——抗战时期给日本做汉奸的人们,还有掌握重要情报的间谍们。以及发展到现在的处在老师与同学之间的“情报员”。哈哈哈想想确实挺有趣的。

      现在我们就用一张图来表示一下:

                      

       这张图看上去很抽象,其实与具体的实例结合很好理解的。就是通风报信的人是一类,接受着实一类。不管是观察的对象,还是通风报信的人都有一个特征就是身上都携带着信息,这个信息正好是观察者要用的,所以把这个抽象出一个抽象类即信息类。还有一类人就是观察者,他要通过“情报员”给自己的信息来调整自己的状态,来装老师眼中的”好学生“。不知这样讲解您是否理解了。

其次我们来说一下为什么要使用观察者模式。

       当一个对象的改变需要同时改变其他对象,同时它也不知道具体有多少对象要改变的时候,应该用观察者模式。专业昂一个抽象模型由两个方面,其中一方面依赖于另一方面,这是用观察者模式可以将这两者缝扎ungzai独立的对象中使它们各自独立地改变和复用。

       这样观察者模式所做的工作就是在解耦合。让耦合双方都依赖于抽象。而不是依赖于具体。从而使得一方面的棉花都不会影响另一方面的变化。同时这就是依赖倒转原则的体现与运用。

我的高中生活。

       讲了这么多理论,想必看都要看哭了!接下来 为大家讲个有意思的事情——我的高中生活。

       高中三年,风风雨雨,每天无时无刻不在和老师和困意战斗着。上次自考的时候在一中发现了很好玩的一件事,教室前边们没玻璃,只有后边有那么一小条玻璃。哈哈哈哈哈。感觉好悲惨,老师真狠。然后又想到了我的高中生活。每天高中忙在题海中,偶尔的放松一下也是允许自己的,但是有害怕被老师看到,所以呢。周围约定好这周谁负责情报,下周谁负责。这样我们这些偷懒的”好学生“就开始传纸条,看小说,说小话,吃点小零食。这时候老师突然来了,间谍就开始通知了,然后我们便回复正常的状态,这样一次次的成为老师眼中的”好学生“!

       现在我们来吧这个写成一个观察者模式的例子:

 interface Subject  //不管是谁通知,他们可以同为一个接口,让老板或者秘书来实现这个借口就可以了
    {
        void Attach(Observe observe);
        void Detach(Observe observe);
        void Notify();
        string SubjectState
        {
            get;
            set;
        }

    }

    class Boss : Subject
    {
        private IList<Observe> observes = new List<Observe>();   //增加要通知的人员列个单子
        private string action;

        public void Attach(Observe observe)
        {
            observes.Add(observe);
        }
        public void Detach(Observe observe)
        {
            observes.Remove(observe);
        }
        public void Notify()
        {
            foreach (Observe o in observes)
                o.Update();
        }

        public string SubjectState
        {
            get { return action; }
            set { action = value; }
        }
    }


    abstract class Observe
    {
        protected string name;
        protected Subject sub;

        public Observe(string name, Subject sub)
        {
            this.name = name;
            this.sub = sub;
        }
        public abstract void Update();
    }

    class StockObserve : Observe
    {
        public StockObserve(string name, Subject sub)
            : base(name, sub)
        { }
        public override void Update()
        {
            Console.WriteLine("{0} {1}  藏起小说,拿出数学卷子", sub.SubjectState, name);
        }
    }

    class NBAObserve : Observe
    {
        public NBAObserve(string name, Subject sub)
            : base(name, sub)
        { }
        public override void Update()
        {
            Console.WriteLine("{0}{1} 收起零食,拿出英语卷子,学习!", sub.SubjectState, name);
        }
    }

static void Main(string[] args)
        {
            Boss Li = new Boss();
            StockObserve A = new StockObserve("小李子", Li);
            NBAObserve B = new NBAObserve("小扇子", Li);

            Li.Attach(A);
            Li.Detach(B);
            Li.SubjectState = "李老师在后门看!!";  //注意代码的逻辑先写那一部分再写那一部分
            Li.Notify();
            Console.Read();
       }
        


      

  

       这里的小扇子没有被通知到,很稀罕他被忽视了,所以他就自认倒霉吧!!关于上边的例子大家应该都经历过,因为我们都是“好学生”!!


       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值