zoukankan      html  css  js  c++  java
  • 设计模式----观察者模式

            今天,我们来讲讲观察者模式。。所谓观察者模式就是一种观察者的模式(哈哈),其实观察者模式就一句话:对象和行为分离。。如果你理解了这句话,观察者模式你就学会了,怎么样,是不是特别简单。。额,如果不理解的话请看以下代码。。

    abstract class Observer
        {
            public abstract void Update();
        }

            首先,观察者模式,当然不能少了观察者,Observer类就是我们抽象出来的观察者,它只有一个方法Update,然后呢,前面我们不是说了吗,观察者模式核心就是对象和行为分离,既然对象有了,那么行为也该出场了啊。。

    abstract class Subject
        {
            private IList<Observer> observers = new List<Observer>();
    
            public void Attach(Observer observer)
            {
                observers.Add(observer);
            }
            public void Detach(Observer observer)
            {
                observers.Remove(observer);
            }
            public void Notify()
            {
                foreach (Observer o in observers)
                {
                    o.Update();
                }
            }
        }

             Subject类就是我们的通知者,也就是我们所说的被观察者,它有三个方法和一个list集合,Attach方法就是往集合中添加观察对象,Detach方法就是往集合中减除观察对象,而Notify方法是执行所有被观察对象的Update方法,也就是修改状态(这个就是行为,由被观察者来通知观察者并改变其状态)。这些做完之后,我们就要开始去实现真正的观察对象和通知对象了,请看代码

    class ConcreteObserver : Observer
        {
            private string name;
            private string observerState;
            private ConcreteSubject subject;
    
            public ConcreteObserver(ConcreteSubject subject, string name)
            {
                this.subject = subject;
                this.name = name;
            }
    
            public override void Update()
            {
                observerState = subject.SubjectState;
                Console.WriteLine("观察者{0}的新状态是{1}", name, observerState);
            }
    
            public ConcreteSubject Subject
            {
                get { return subject; }
                set { subject = value; }
            }
        }
    
    
    
    class ConcreteSubject : Subject
        {
            private string subjectState;
    
            //具体被观察者状态
            public string SubjectState
            {
                get { return subjectState; }
                set { subjectState = value; }
            }
        }

            我们首先看ConcreteObserver类,它继承Observer类,所以它是具体观察者,然后我们看ConcreteSubject类,它继承Subject类,所以它是具体通知者。。我们接着看他们内部,首先是ConcreteSubject类,它只有一个属性SubjectState,然后我们看ConcreteObserver类,首先是构造函数,它注入了具体通知者和name,然后重写Update方法,修改修改自身状态。好了,观察者模式就写完了,现在,让我们来通过上层使用来全局看看是如何运转的

     class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("***********观察者模式************");
                ConcreteSubject s = new ConcreteSubject();
                s.Attach(new ConcreteObserver(s, "x"));
                s.Attach(new ConcreteObserver(s, "y"));
                s.Attach(new ConcreteObserver(s, "z"));
                s.SubjectState = "ABC";
                s.Notify();
            }
        }

            首先是new一个通知者,然后通知者添加观察对象(它得知道有多少人在偷看它对吧),所有观察者模式还有一个别名叫发布--订阅模式。ConcreteSubject就是发布者,ConcreteObserver就是订阅者,好,接下来我们就看看实现运行效果如何。。。

            这里我们可以看到当我们改变发布者状态的时候,所有的观察者状态都得到了改变。。这样我们的目的也就达到了,当我发布东西的时候,我需要通知所有订阅我的人我的状态。。。

            对象和行为分离:所有的观察者和通知者之间没有必然的联系,观察者只负责观察(也就是订阅),改变行为通知观察者交给通知者统一管理。这就是我们今天的观察者模式了。。。

  • 相关阅读:
    go语言从例子开始之Example22.协程之通道
    go语言从例子开始之Example21.协程
    go语言从例子开始之Example20.错误处理
    go语言从例子开始之Example19.接口
    级联复制改成主从复制
    一主二从改成级联复制架构步骤
    mysql8.0 备分常用命令
    mysql8基于gtid导出导入搭建主从
    MySQL 8.0 配置mysql_native_password身份验证插件的密码
    mysql_config_editor 安全登录方式
  • 原文地址:https://www.cnblogs.com/liuhuimh/p/10780035.html
Copyright © 2011-2022 走看看