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

    一.介绍  

      观察者模式(Observer Pattern)。属于行为型模式。它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

    二.实现

      举个例子,我们开车时,当踩油门加速的时候,显示器上会显示车速,而超速的话,警报器会发出警报。车只是在加速,而显示器和警报器却可以监听到车速的变化。

    //系统
    public abstract class System
    {
        //加速,踩油门
        public abstract void Accelerate(int speed);
    }
    
    //显示器
    public class Screen : System
    {
        public override void Accelerate(int speed)
        {
            Console.WriteLine("车速" + speed);
        }
    }
    
    //警报铃
    public class Alarm : System
    {
        public override void Accelerate(int speed)
        {
            if (speed >= 100)
            {
                Console.WriteLine("哔哔,已经超速");
            }
        }
    }
    
    //交通工具
    public abstract class Vehicle
    {
        public List<System> systems = new List<System>();
        //装系统
        public void Attach(System obs)
        {
            systems.Add(obs);
        }
        //卸载系统
        public void Detach(System obs)
        {
            systems.Remove(obs);
        }
        public void Notify(int speed)
        {
            systems.ForEach(o => o.Accelerate(speed));
        }
    }
    
    //汽车
    public class Car : Vehicle
    {
        private int speed;//速度
        protected void Accelerate(int speed)
        {
            base.Notify(speed);
        }
    
        //开车
        public void Go()
        {
            for (int i = 0; i <= 99; i++)
            {
                speed = i + 1;
                if (speed > 95)
                {
                    Accelerate(speed);
                }
            }
        }
    }
    
    //调用
    public static void Main(string[] args)
    {
        Car car = new Car();
        System screen = new Screen();
        System alarm = new Alarm();
        car.Attach(screen);//开启显示器
        car.Attach(alarm);//开启警报器
        car.Go();
    }

      汽车Car作为发布信息的主体,系统System如显示器、警报器则监听汽车的信息。为了降低耦合,汽车使用“发布-订阅”的方式,而不是直接调用系统的方法。Car用订阅列表来存放需要使用的系统,等需要发布的时候,再通知到已经订阅的各个系统中。

      在C#中,我们还可以使用委托和事件的方式去实现观察者模式,委托就相当订阅列表,当目标触发了委托之中的事件时,则委托就会自动去调用观察者注册的方法。

    //交通工具
    public abstract class Vehicle
    {
        public delegate void Handler(int speed);//定义委托类型
    
        public event Handler Event;//绑定委托的事件 
    
        //装系统
        public void Attach(System obs)
        {
            Event += obs.Accelerate;//在委托中增加方法
        }
        //卸载系统
        public void Detach(System obs)
        {
            Event -= obs.Accelerate;//在委托中减少方法
        }
        public void Notify(int speed)
        {
            if (Event != null)
            {
                Event(speed);
            }
        }
    }
    //。。。
    //其它代码实现和上面例子一样

    3.总结

      优点:

      1.将一个目标对象的变化通知到观察者类。

      2.使得目标对象和观察者对象解耦,如果需要添加新的观察者,只需要在抽象类上拓展并订阅即可。

  • 相关阅读:
    git 忽略文件夹权限
    文字特效-shine.js-阴影随动
    微信小程序scroll-view中的坑(因为动态设置高度导致无法下拉)
    gitlab 403 forbidden 报错解决
    Vue子组件调用父组件的方法
    github的小笔记
    windows win10 重装系统 提示不是gpt分区不能安装
    使用html5播放m3u8直播源
    youtube-dl 使用简介
    ABAP RSA 加密
  • 原文地址:https://www.cnblogs.com/shadoll/p/14333401.html
Copyright © 2011-2022 走看看