zoukankan      html  css  js  c++  java
  • 设计模式(3)观察者模式

    概述

    在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的

    依赖对象(观察者对象)都将得到通知。如果耦合过强,代码的维护性和扩展性就会变差。这样一来就引出了观察者模

    式(Observer),也称发布-订阅模式(Publish/Subscribe)。所有的操作都是通过调用接口来实现,将这种依赖关系

    弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。 

    结构图


    具体模式


    抽象通知者Subject类

          当观察者发生变化,通过Notify接口通知所有观察者。避免直接的实现,降低耦合。

    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();
                }
            }
        }

    抽象观察者Observers类

    当得到主题通知时,调用Update。称为更新接口

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

    具体观察者concreteObserver类

         实现抽象观察者的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 );
            }
        }


          客户端


    static void Main(string[] args)
            {
                ConcreteSubject a = new ConcreteSubject();
    
                a.Attach(new ConcreteObserver (a,"b"));
    
                a.SubjectState = "状态a";
                a.Notify();
    
                Console.Read();
            }


  • 相关阅读:
    中文词频统计及词云制作
    字符串操作练习:星座、凯撒密码、99乘法表、词频统计预处理
    python第二节课
    Python第一节课
    了解大数据
    pcb结构定义
    一个完整的大作业
    中文词频统计及词云制作
    字符串操作练习:星座、凯撒密码、99乘法表、词频统计预处理
    Python输入输出练习
  • 原文地址:https://www.cnblogs.com/guziming/p/4232751.html
Copyright © 2011-2022 走看看