观察者模式之🐱🐭👩实例

2019/10/15 44

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

观察者模式的动机是什么?

上述都是又臭又长地文本,但确实值得一读。这几天再看面试题时发现了一个题目:🐱大叫一声,所有的🐭都开始逃跑,👩被惊醒。这不就是典型的观察者模式吗?题目有两项要求更直接的说明了让做题者使用观察者模式

  1. 要有联动性,🐭和👩的行为是被动的。
  2. 考虑可扩展性,🐱的叫声可能引起其他联动效应。
interface ISubscribe
{
    void Response();
}

class Mouse : ISubscribe
{
    public Mouse(string name)
    {
        Name = name;
    }

    public string Name { get; set; }

    public void Response()
    {
        Console.WriteLine($"🐭({Name}):老大来了,溜了溜了。");
    }
}

class Human : ISubscribe
{
    public void Response()
    {
        Console.WriteLine("👩:太吵了,醒来看看情况吧。");
    }
}

interface INotifier
{
    void Notify();
    void Attach(ISubscribe subs);
    void Detach(ISubscribe subs);
}

class Cat : INotifier
{
    public Cat()
    {
        _subscribes = new List<ISubscribe>();
    }

    private List<ISubscribe> _subscribes;

    public void Attach(ISubscribe subs) => _subscribes.Add(subs);

    public void Detach(ISubscribe subs) => _subscribes.Remove(subs);

    public void Notify()
    {
        foreach (var item in _subscribes)
        {
            item.Response();
        }
    }

    public void Miao()
    {
        Console.WriteLine("🐱:喵喵喵");
        Notify();
    }
}

class Program
{
    static void Main(string[] args)
    {
        var tom = new Cat();

        var jerry = new Mouse("Jerry");
        var mickey = new Mouse("Mickey");
        var xg = new Human();

        tom.Attach(jerry);
        tom.Attach(mickey);
        tom.Attach(xg);

        tom.Miao();
    }
}

输出

🐱:喵喵喵
🐭(Jerry):老大来了,溜了溜了。
🐭(Mickey):老大来了,溜了溜了。
👩:太吵了,醒来看看情况吧。

将来更多的对象,只要实现了 ISubscribe 接口就可以了。上述代码简单的体现了开闭原则高内聚,将简单的 Miao() 对外提供,隐藏了具体通知实现。

评论