Event 发布与订阅(一)

前言

主要讲的是发布与订阅在Event中的一个简单实现用来加深理解。

C #中的事件(Event)的理解:

事件具有以下属性:(From Events)

  • 发行者确定何时引发事件;订户确定对事件作出何种响应。
  • 一个事件可以有多个订户。 订户可以处理来自多个发行者的多个事件。
  • 没有订户的事件永远也不会引发。
  • 事件通常用于表示用户操作,例如单击按钮或图形用户界面中的菜单选项。
  • 当事件具有多个订户时,引发该事件时会同步调用事件处理程序。 若要异步调用事件,请参阅 Calling Synchronous Methods Asynchronously
  • 在 .NET Framework 类库中,事件基于 EventHandler 委托和 EventArgs 基类。
发布与订阅(Observer, Publish-Subscribe)

意图:

 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并主动更新。解耦

别名: 依赖(Dependents),发布-订阅(Publish-Subscribe)

 Observer模式描述了如何建立这种关系。这一模式中的关键对象是目标(Object)和观察者(observer)。一个目标可以有任意数目的依赖它的观察者。一旦目标的状态发生改变,所有的观察者都得到通知。作为对这个通知的响应,每个观察者都将查询目标以使其状态与目标的状态同步。

 这种交互也称为 发布-订阅。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者。可以有任意数目的观察者订阅并接收通知。

发布与订阅的实践

假设一个这样的场景。车类,以及乘客类

车类里:有一个事件,开车通知。有一个方法,开车。

调用开车方法时,通知订阅了开车通知的观察者,然后开车。

首先是定义一个车类:

using System;

namespace EventDemo {
    public class MyCar {
        //定义一个 上车 的委托
        public delegate void BeginOnCarHandler ();

        //定义一个 上车 委托方法的事件
        public event BeginOnCarHandler CarNotification;

        public string Name { get; set; }

        public void RunCar () {
            CarNotification ();
            Console.WriteLine ("好的,都上车了司机" + Name + ",开车了");
        }
    }
}

然后定义一个乘客类:

namespace EventDemo {
    public class Passenger {

        public string Name { get; set; }

        public void BeginToCar () {
            System.Console.WriteLine ("我上车了,我是:" + Name);
        }
    }
}

最后执行:

MyCar benz = new MyCar { Name = "Benz" };

            Passenger p4 = new Passenger { Name = "xiaoming" };
            Passenger p2 = new Passenger { Name = "xiaohong" };

            benz.CarNotification += new MyCar.BeginOnCarHandler(p2.BeginToCar);
            benz.CarNotification += new MyCar.BeginOnCarHandler(p4.BeginToCar);

            benz.RunCar ();

最后的结果为

006tNc79gy1fq9pb3duwdj315y03cq3x.jpg

上面的方法

benz.CarNotification += new MyCar.BeginOnCarHandler(p2.BeginToCar);

也可以改成

benz.CarNotification += p2.BeginToCar;

上面就是一个简单的发布/订阅的例子,在EventBus中也有其涉及的地方,正好可以了解记录一下。

今天下午又仔细思考了一下,更新了一下实例,如下:

一个车,是被观察者,也就是目标 object,它有一个事件,暂且叫它 发车事件。以及观察者 乘客类。

修改了一下Event代码:

using System;

namespace EventDemo {
    public class MyCar {
        //定义一个 上车 的委托
        public delegate void CarHandler (MyCar car);

        //定义一个 上车 委托方法的事件
        public event CarHandler CarNumberNotification;

        public string Name { get; set; }

        public int Count { get; set; }

        public void RunCar () {
            Console.WriteLine ($"好的,准备上车了,车名为:{Name},车上人数:{Count}");
            if (CarNumberNotification != null) {
                CarNumberNotification (this);
            }
            Console.WriteLine ($"The people now is:{Count}");
        }
    }
}
namespace EventDemo {
    public class Passenger {

        public string Name { get; set; }

        public void BeginToCar (MyCar car) {
            car.Count++;
            System.Console.WriteLine ($"我上车了,我是:{Name},我坐的车是{car.Name}");
        }
    }
}
            MyCar benz = new MyCar { Name = "Benz" };

            Passenger p1 = new Passenger { Name = "xiaoming" };
            Passenger p2 = new Passenger { Name = "xiaohong" };

            benz.CarNumberNotification += p1.BeginToCar;
            benz.CarNumberNotification += p2.BeginToCar;

            benz.RunCar ();

这样编写代码更加容易理解一些。

006tNc79gy1fqa0ckb6cej312u04e0u1.jpg

转载于:https://www.cnblogs.com/xiyin/p/8806440.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的Java实现发布订阅模式的示例: ```java import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; interface Subscriber { void onEvent(String eventType, Object data); } class Publisher { private Map<String, List<Subscriber>> subscribers = new HashMap<>(); public void subscribe(String eventType, Subscriber subscriber) { List<Subscriber> subscriberList = subscribers.getOrDefault(eventType, new ArrayList<>()); subscriberList.add(subscriber); subscribers.put(eventType, subscriberList); } public void unsubscribe(String eventType, Subscriber subscriber) { List<Subscriber> subscriberList = subscribers.getOrDefault(eventType, new ArrayList<>()); subscriberList.remove(subscriber); subscribers.put(eventType, subscriberList); } public void publish(String eventType, Object data) { List<Subscriber> subscriberList = subscribers.getOrDefault(eventType, new ArrayList<>()); for (Subscriber subscriber : subscriberList) { subscriber.onEvent(eventType, data); } } } class MessageSubscriber implements Subscriber { private String name; public MessageSubscriber(String name) { this.name = name; } @Override public void onEvent(String eventType, Object data) { System.out.println(name + " received message: " + data); } } public class PubSubDemo { public static void main(String[] args) { Publisher publisher = new Publisher(); Subscriber subscriber1 = new MessageSubscriber("Subscriber 1"); Subscriber subscriber2 = new MessageSubscriber("Subscriber 2"); Subscriber subscriber3 = new MessageSubscriber("Subscriber 3"); publisher.subscribe("message", subscriber1); publisher.subscribe("message", subscriber2); publisher.subscribe("alert", subscriber3); publisher.publish("message", "Hello World!"); publisher.publish("alert", "Warning: High CPU usage!"); publisher.unsubscribe("message", subscriber2); publisher.publish("message", "Goodbye World!"); } } ``` 上述代码实现了一个简单的发布订阅模式,其中 `Publisher` 表示发布者,`Subscriber` 表示订阅者,`MessageSubscriber` 是一个订阅者的实现类,`PubSubDemo` 是一个包含 `main` 方法的示例类。在 `main` 方法中,我们创建一个 `Publisher` 对象,然后创建三个不同的订阅者,并通过 `subscribe` 方法订阅了两种事件类型:`message` 和 `alert`。接着我们通过 `publish` 方法向所有订阅了 `message` 事件类型的订阅者发送了一条消息,然后向所有订阅了 `alert` 事件类型的订阅者发送了一条警告消息。最后,我们通过 `unsubscribe` 方法取消了一个订阅者的订阅
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值