• 设计模式(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();
            }


  • 相关阅读:
    Weex-语法笔记 一
    Entitlements (授权机制) 延伸
    FOUNDATION_EXPORT 延伸
    NS_ASSUME_NONNULL_BEGIN 延伸
    SSLPinning 延伸
    Socket.io 延伸
    UI_APPEARANCE_SELECTOR 延伸
    Modules和Autolinking
    代码块(Block)回调一般阐述
    数据库连接池配置错误导致OOM
  • 原文地址:https://www.cnblogs.com/guziming/p/4232751.html
Copyright © 2020-2023  润新知