643
Chương 16: Các giao diện và mẫu thông dụng
get { return instance; }
}
// Các phương thức public cung cấp chức năng của singleton.
public void SomeMethod1 () { /*..*/ }
public void SomeMethod2 () { /*..*/ }
}
Để gọi các chức năng của lớp
SingletonExample
, bạn có thể lấy về một tham chiếu đến
singleton bằng thuộc tính
Instance
và rồi gọi các phương thức của nó. Bạn cũng có thể trực
tiếp thực thi các thành viên của singleton thông qua thuộc tính
Instance
. Đoạn mã dưới đây
trình bày cả hai cách này:
// Thu lấy tham chiếu đến singleton và gọi một phương thức của nó.
SingletonExample s = SingletonExample.Instance;
s.SomeMethod1();
// Thực thi chức năng của singleton mà không cần tham chiếu.
SingletonExample.Instance.SomeMethod2();
10.
10.
Hi n th c m u Observer
ệ
ự ẫ
Hi n th c m u Observer
ệ
ự ẫ
Bạn cần hiện thực một cơ chế hiệu quả để một đối tượng (subject) báo với các đối
tượng khác (observer) về những thay đổi trạng thái của nó.
Hiện thực mẫu Observer bằng các kiểu ủy nhiệm (đóng vai trò là các con trỏ hàm
an-toàn-về-kiểu-dữ-liệu—type-safe function pointer) và các kiểu sự kiện.
Cách truyền thống khi hiện thực mẫu Observer là hiện thực hai giao diện: một để mô tả
observer (
IObserver
) và một để mô tả subject (
ISubject
). Các đối tượng có hiện thực
IObserver
sẽ đăng ký với subject, cho biết chúng muốn được thông báo về các sự kiện quan
trọng (như thay đổi trạng thái) tác động đến subject. Subject chịu trách nhiệm quản lý danh
sách các observer đã đăng ký và thông báo với chúng khi đáp ứng các sự kiện tác động đến
subject. Subject thường thông báo với observer bằng phương thức
Notify
(được khai báo
trong giao diện
IObserver
). Subject có thể truyền dữ liệu cho observer trong phương thức
Notify
, hoặc observer có thể cần gọi một phương thức được khai báo trong giao diện
ISubject
để thu lấy thêm các chi tiết về sự kiện.
Mặc dù bạn có thể hiện thực mẫu Observer bằng C# theo cách vừa được mô tả, nhưng vì mẫu
Observer quá phổ biến trong các giải pháp phần mềm hiện đại nên C# và .NET Framework
cung cấp các kiểu sự kiện và ủy nhiệm để đơn giản hóa hiện thực của nó. Sử dụng sự kiện và
ủy nhiệm nghĩa là bạn không cần khai báo giao diện
IObserver
và
ISubject
. Ngoài ra, bạn
không cần hiện thực các logic cần thiết để quản lý và thông báo với các observer đã đăng ký
—đây chính là phần dễ xảy ra lỗi nhất khi viết mã.