18_观察者模式

观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,其相关依赖对象会自动收到通知并更新。

观察者模式有四个主要角色:

  1. 主题(Subject):定义了观察者的注册、删除和通知方法。主题可以是具体类或接口。

  2. 具体主题(Concrete Subject):继承或实现了主题,并实现了注册、删除和通知方法。具体主题内部维护了一个观察者列表,并在状态发生改变时通知观察者。

  3. 观察者(Observer):定义了更新方法,用于接收主题的通知并进行相应的处理。观察者可以是具体类或接口。

  4. 具体观察者(Concrete Observer):继承或实现了观察者,并实现了更新方法。具体观察者在接收到主题的通知后,执行相应的业务逻辑。

观察者模式的工作原理如下:

  1. 主题维护了一个观察者列表,可以在需要的时候注册、删除和通知观察者。

  2. 具体主题实现了主题接口,并在需要的时候调用观察者的更新方法。

  3. 观察者实现了观察者接口,并在接收到主题的通知后执行相应的更新操作。

观察者模式的优点包括:

  1. 解耦了主题和观察者之间的关系,使得它们可以独立地变化。

  2. 可以实现一对多的依赖关系,主题的状态改变时可以同时通知多个观察者。

  3. 可以方便地增加或删除观察者,扩展新的观察者类。

观察者模式适用于以下场景:

  1. 当一个对象的改变需要同时影响其他对象,并且不希望对象之间紧密耦合时,可以使用观察者模式。

  2. 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,可以使用观察者模式。

总结而言,观察者模式通过定义对象之间的一对多依赖关系,实现了当一个对象的状态发生改变时,其相关依赖对象会自动收到通知并更新。它提供了一种松耦合的方式来处理对象之间的关系,并支持一对多的依赖关系。

 

案例场景:

猫大叫一声,老鼠赶紧逃跑,主人醒来开灯看看怎么回事?

猫就是主题角色(被观察者),老鼠和主人就是观察者角色。

 

Subject

/// <summary>
    /// 被观察者的抽象基类
    /// </summary>
    public abstract class Subject
    {
        private IList<Observer> _observers = new List<Observer>();//当前主题对象的观察者集合

        /// <summary>
        /// 添加观察者
        /// </summary>
        /// <param name="observer"></param>
        public void Attach(Observer observer)
        {
            _observers.Add(observer);
        }

        /// <summary>
        /// 移除观察者
        /// </summary>
        /// <param name="observer"></param>
        public void Detach(Observer observer)
        {
            _observers.Remove(observer);
        }

        public void Nofity()
        {
            Console.WriteLine("猫突然大叫一声...喵...");

            foreach (var item in _observers)
            {
                item.Update();
            }
        }
    }

 

Observer

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

 

Concrete Subject

public class Cat : Subject
    {
    }

 

Concrete Observer

public class Mouse : Observer
    {
        public override void Update()
        {
            Console.WriteLine("老鼠:快跑,被老猫发现了...");
        }
    }
public class Master : Observer
    {
        public override void Update()
        {
            Console.WriteLine("主人:我家的猫又叫了,开灯看看怎么回事?");
        }
    }

 

调用

internal class Client
    {
        public void Start()
        {
            Cat cat = new Cat();
            cat.Attach(new Mouse());
            cat.Attach(new Master());
            cat.Nofity();
        }
    }
static void Main(string[] args)
        {
            new Client().Start();

            Console.ReadKey();
        }

 

 

posted @ 2024-03-14 10:03  野码  阅读(12)  评论(0编辑  收藏  举报