栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

22/23 观察者模式和发布订阅模式

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

22/23 观察者模式和发布订阅模式

1.观察者模式(Observer Pattern)

一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

1.1案例

现在有对象:孩子、猫、狗、手机、母亲

现在手机响了->猫叫了一声-> 狗叫了一声->孩子哭了->母亲关闭手机

1.1.1版本

代码如下:

public class Baby
{
    public void Cry()
    {
        Console.WriteLine("宝贝哭了...");
    }
}
public class Cat
{
    public void Miao()
    {
        Console.WriteLine("猫叫:Miao");
    }
}
public class Dog
{
    public void Wang()
    {
        Console.WriteLine("狗:Wang、Wang、Wang....");
    }
}
public class Mother
{
    public void EmbraceBaby()
    {
        Console.WriteLine("母亲抱了抱宝宝...");
    }
}
public class Phone
{
    public void Rings()
    {
        Console.WriteLine("手机响了");
    }
}


private void btnSimple_Click(object sender, EventArgs e)
{
    new Phone().Rings();
    new Cat().Miao();
    new Dog().Wang();
    new Baby().Cry();
    new Mother().EmbraceBaby();
}

1.1.2版本

我们整理为对象的方式

public abstract class IObserver
{
    public abstract void Action();
    private List ListObserver = new List();
    public void AddObserver(IObserver pObserver)
    {
        ListObserver.Add(pObserver);
    }
    public void NotifyAllObservers()
    {
        foreach (var item in ListObserver)
        {
            item.Action();
        }
    }
}

public class Phone: IObserver
{
    public void Rings()
    {
        Console.WriteLine("手机响了");
    }
    public override void Action()
    {
        Rings();
    }
}
public class Cat : IObserver
{
    public void Miao()
    {
        Console.WriteLine("猫叫:Miao");
    }

    public override void Action()
    {
        Miao();
    }
}
public class Dog : IObserver
{
    public void Wang()
    {
        Console.WriteLine("狗:Wang、Wang、Wang....");
    }

    public override void Action()
    {
        Wang();
    }
}
public class Baby: IObserver
{
    public void Cry()
    {
        Console.WriteLine("宝贝哭了...");
    }

    public override void Action()
    {
        Cry();
    }
}
public class Mother : IObserver
{
    public void EmbraceBaby()
    {
        Console.WriteLine("母亲抱了抱宝宝...");
    }

    public override void Action()
    {
        EmbraceBaby();
    }
}
private void btnObject_Click(object sender,EventArgs e)
{
    Phone pPhone = new Phone();
    pPhone.AddObserver(new Cat());
    pPhone.AddObserver(new Dog());
    pPhone.AddObserver(new Baby());
    pPhone.AddObserver(new Mother());
    pPhone.Rings();
    pPhone.NotifyAllObservers();
}

1.1.3版本

以上版本存在以下问题

  • 每一个对象只能符合一个行为,比如:现在将过程改变为:

手机响了->猫叫了一声-> 狗叫了一声->孩子哭了->母亲抱了抱->关闭手机->孩子睡着了->狗去抓老鼠了

以下使用事件实现:

public abstract class IObserver
{
    public abstract void Action();

    private List ListObserver = new List();

    public void AddObserver(IObserver pObserver)
    {
        ListObserver.Add(pObserver);
    }

    public void NotifyAllObservers()
    {
        foreach (var item in ListObserver)
        {
            item.Action();
        }
    }

    private event Action NotifyAllObserversHandeler;

    public void AddObserver(Action pAction)
    {
        NotifyAllObserversHandeler += pAction;
    }

    public void RemoveObserver(Action pAction)
    {
        NotifyAllObserversHandeler -= pAction;
    }
    public void NotifyAllObserversHandler()
    {
        NotifyAllObserversHandeler.Invoke();
    }
}
public class Phone: IObserver
{
    public void Rings()
    {
        Console.WriteLine("手机响了");
    }

    public void ClosePhone()
    {
        Console.WriteLine("关闭手机");
    }

    public override void Action()
    {
        Rings();
    }
}
public class Baby: IObserver
{
    public void Cry()
    {
        Console.WriteLine("宝贝哭了...");
    }

    public void Sleep()
    {
        Console.WriteLine("宝宝睡着了...");
    }

    public override void Action()
    {
        Cry();
    }
}
public class Cat : IObserver
{
    public void Miao()
    {
        Console.WriteLine("猫叫:Miao");
    }

    public override void Action()
    {
        Miao();
    }
}
public class Dog : IObserver
{
    public void Wang()
    {
        Console.WriteLine("狗:Wang、Wang、Wang....");
    }

    public void DogTrying2CatchMice()
    {
        Console.WriteLine("狗拿耗子");
    }

    public override void Action()
    {
        Wang();
    }
}
public class Mother : IObserver
{
    public void EmbraceBaby()
    {
        Console.WriteLine("母亲抱了抱宝宝...");
    }

    public override void Action()
    {
        EmbraceBaby();
    }
}
public class Mother : IObserver
{
    public void EmbraceBaby()
    {
        Console.WriteLine("母亲抱了抱宝宝...");
    }

    public override void Action()
    {
        EmbraceBaby();
    }
}

2.发布订阅模式

先看观察者模式和发布订阅模式的区别

2.1发布订阅模式的简介以及优缺点

具体参考链接:https://www.jianshu.com/p/c391c77a8771,
好文章直接用,我不喜欢粘贴,搞得百度出来全部都是…

2.2简单实现
public static class ServiceInstance 
        where T:class
   private static event Action NotifyHandeler;
   public static void Publish(T tValue)
   {
       NotifyHandeler.Invoke(tValue);
   }
   public static void Subscribe(Action pAction)
   {
       NotifyHandeler += pAction;
   }

public class PhoneRing
{


}

private void btnPublishSubscribe_Click(object sender, EventArgs e)
{
    Phone pPhone = new Phone();
    pPhone.Rings();
    PhoneRing pPhoneRing = new PhoneRing();
    ServiceInstance.Subscribe(new Action((a) => new Cat().Miao()));
    ServiceInstance.Subscribe(new Action((a) => new Dog().Wang()));
    ServiceInstance.Subscribe(new Action((a) => new Baby().Cry()));
    ServiceInstance.Subscribe(new Action((a) => new Mother().EmbraceBaby()));
    ServiceInstance.Subscribe(new Action((a) => new Phone().ClosePhone()));
    ServiceInstance.Subscribe(new Action((a) => new Baby().Sleep()));
    ServiceInstance.Subscribe(new Action((a) => new Dog().DogTrying2CatchMice()));
    ServiceInstance.Publish(pPhoneRing);
}

3.结语

其实今天的例子举得不好,有点像责任链,这个只是说当手机响了之后谁要做什么事情…

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/911333.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号