Trong mô hình này, bạn có các nhà xuất bản sẽ làm một số logic và xuất bản một "sự kiện".
Sau đó, nhà xuất bản sẽ chỉ gửi sự kiện của họ tới những người đăng ký nhận sự kiện cụ thể.
Trong C#, bất kỳ đối tượng nào đều có thể xuất bản một tập hợp các sự kiện mà các ứng dụng khác có thể đăng ký.
Khi lớp xuất bản tăng sự kiện, tất cả các ứng dụng đã đăng ký sẽ được thông báo.
Hình dưới đây cho thấy cơ chế này.
đơn giản Ví dụ có thể trên sự kiện và đại biểu trong C#:
code đang tự giải thích, Ngoài ra tôi đã thêm những ý kiến rõ ràng ra các mã.
using System;
public class Publisher //main publisher class which will invoke methods of all subscriber classes
{
public delegate void TickHandler(Publisher m, EventArgs e); //declaring a delegate
public TickHandler Tick; //creating an object of delegate
public EventArgs e = null; //set 2nd paramter empty
public void Start() //starting point of thread
{
while (true)
{
System.Threading.Thread.Sleep(300);
if (Tick != null) //check if delegate object points to any listener classes method
{
Tick(this, e); //if it points i.e. not null then invoke that method!
}
}
}
}
public class Subscriber1 //1st subscriber class
{
public void Subscribe(Publisher m) //get the object of pubisher class
{
m.Tick += HeardIt; //attach listener class method to publisher class delegate object
}
private void HeardIt(Publisher m, EventArgs e) //subscriber class method
{
System.Console.WriteLine("Heard It by Listener");
}
}
public class Subscriber2 //2nd subscriber class
{
public void Subscribe2(Publisher m) //get the object of pubisher class
{
m.Tick += HeardIt; //attach listener class method to publisher class delegate object
}
private void HeardIt(Publisher m, EventArgs e) //subscriber class method
{
System.Console.WriteLine("Heard It by Listener2");
}
}
class Test
{
static void Main()
{
Publisher m = new Publisher(); //create an object of publisher class which will later be passed on subscriber classes
Subscriber1 l = new Subscriber1(); //create object of 1st subscriber class
Subscriber2 l2 = new Subscriber2(); //create object of 2nd subscriber class
l.Subscribe(m); //we pass object of publisher class to access delegate of publisher class
l2.Subscribe2(m); //we pass object of publisher class to access delegate of publisher class
m.Start(); //starting point of publisher class
}
}
Output:
Nghe Nó bởi Listener
Nghe Nó bởi Listener2
Nghe Nó bởi Listener
Nghe Nó bởi Listener2
Nghe Nó bởi Nghe er . . . (số lần vô hạn)
Để tiết kiệm cho mình một vài dòng và tránh kiểm tra trống, hãy khởi tạo sự kiện của bạn như sau: http://stackoverflow.com/questions/340610/create-empty-c-event-handlers-automatically/ 340618 # 340618 – Dinah
@Dinah: Điều đó không tránh được việc kiểm tra null. Bạn vẫn có thể thiết lập 'SomethingHappened = null' sau (một cách tiện dụng nếu không có lý do lười biếng và không lý tưởng để hủy đăng ký tất cả các trình xử lý), vì vậy việc kiểm tra null luôn luôn cần thiết. –
@DanPuzey: Bạn có thể trong lớp học, nhưng bằng nhau bạn có thể chắc chắn rằng bạn * không * làm điều đó - và * mã khác * không thể làm điều đó, vì nó chỉ có thể đăng ký và hủy đăng ký. Nếu bạn đảm bảo rằng bạn không bao giờ đặt nó thành null một cách có chủ ý trong lớp của bạn, bạn nên tránh kiểm tra null. –