static void Main(string[] args)
        {
            // Using delegate only

            /*  var pub1 = new Publisher1();
             * var sub1_1 = new Subscriber1(id: 1, publisher: pub1);
             * var sub1_2 = new Subscriber1(id: 2, publisher: pub1);
             * pub1.Publish(100); */

            // Thêm "event" keyword vào, cũng tương tự như trên với Publisher2 và Subscriber2, tuy nhiên phải xem phần Error

            // Khác biệt giữa delegate và event:
            // _ Event có thể được khai báo trong interface, Delegate thì không
            // _ Event chỉ có thể được gọi (invoked) ở bên trong class chứa nó, Delegate thì có thể được gọi ở bất cứ đâu (Tùy thuộc vào access modifier)
            // _ Event ngăn chặn việc gán (assign) ngoài lớp

            // Using EventHandlers
            var pub3   = new Publisher3();
            var sub3_1 = new Subscriber3(id: 1, publisher: pub3);
            var sub3_2 = new Subscriber3(id: 2, publisher: pub3);

            pub3.Publish();

            // Như vậy với EventHandler
            // object sender là publisher, establisher, noticer, broadcaster ... có chức năng truyền thông tin tới những subscriber
            // EventArgs là dữ liệu pass từ publisher đi theo

            Console.ReadKey();
        }
 public Subscriber3(int id, Publisher3 publisher)
 {
     this.id             = id;
     this.publisher      = publisher;
     publisher.OnChange += Reciever;
 }