zoukankan      html  css  js  c++  java
  • 设计模式系列

    当对象之间存在一对多的关系时,若需要进行对象之间的通知,则可使用观察者模式

    介绍

    观察者模式属于行为型模式,当一个对象的状态发生改变时,若我们想通知其他对象,此时可通过观察者模式来进行解决。

    类图描述

    代码实现

    1、定义抽象观察者

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

    2、定义观察者管理类

    public class Subject
    {
        private List<Observer> observers = new List<Observer>();
    
        private int state;
        public int GetState() => this.state;
    
        public void SetState(int state)
        {
            this.state = state;
            NitifyAllObservers();
        }
    
        public void Attach(Observer observer)
        {
            observers.Add(observer);
        }
    
        private void NitifyAllObservers()
        {
            foreach (var observer in observers)
            {
                observer.Update();
            }
        }
    }
    

    3、定义具体观察者

    public class BinaryObserver : Observer
    {
        public BinaryObserver(Subject subject)
        {
            this.subject = subject;
            this.subject.Attach(this);
        }
    
        public override void Update()
        {
            Console.WriteLine($"Binary string:{subject.GetState()}");
        }
    }
    
    public class HexaObserver:Observer
    {
        public HexaObserver(Subject subject)
        {
            this.subject = subject;
            this.subject.Attach(this);
        }
    
        public override void Update()
        {
            Console.WriteLine($"Hex string:{subject.GetState()}");
        }
    }
    
    public class OctalObserver:Observer
    {
        public OctalObserver(Subject subject)
        {
            this.subject = subject;
            this.subject.Attach(this);
        }
    
        public override void Update()
        {
            Console.WriteLine($"Octal string:{subject.GetState()}");
    
        }
    }
    

    4、上层调用

    class Program
    {
        static void Main(string[] args)
        {
            Subject subject = new Subject();
    
            new HexaObserver(subject);
            new OctalObserver(subject);
            new BinaryObserver(subject);
            Console.WriteLine("First state change:15");
            subject.SetState(15);
            Console.WriteLine("Second state change:10");
            subject.SetState(10);
    
            Console.ReadKey();
        }
    }
    

    总结

    观察者模式通过一种集合方式将所有观察者管理起来,并最终循环遍历通知所有对象。

  • 相关阅读:
    超级简单:一步一步教你创建一小型的asp.net mvc 应用程序
    asp.net AJAX 验证用户名是否存在 Jquery
    生成缩略图、为图片添加文字水印、图片水印的类
    图Graph
    [转]Implementing a Generic Binary Tree in C#
    .net C#数据结构
    Why HTML5 is worth your time
    跳跃表SkipList
    C# LockFreeStack类
    [转]泛型弱引用
  • 原文地址:https://www.cnblogs.com/hippieZhou/p/10093772.html
Copyright © 2011-2022 走看看