Tôi đã đọc một bài viết lập trình và nó đã đề cập đến mẫu Decorator. Tôi đã lập trình được một lúc nhưng không có bất kỳ loại giáo dục hay đào tạo chính thức nào, nhưng tôi đang cố gắng tìm hiểu về các mẫu chuẩn và như vậy.
Vì vậy, tôi đã tra cứu Trình trang trí và tìm thấy một bài viết trên Wikipedia về nó. Bây giờ tôi hiểu khái niệm về mẫu Trang trí, nhưng tôi hơi bối rối với đoạn văn này:
Ví dụ, xem xét một cửa sổ trong một hệ thống cửa sổ. Để cho phép cuộn nội dung của cửa sổ, chúng tôi có thể muốn thêm thanh cuộn ngang hoặc dọc vào nó, nếu thích hợp. Giả sử các cửa sổ được đại diện bởi các thể hiện của lớp Window và giả sử lớp này không có chức năng để thêm thanh cuộn. Chúng ta có thể tạo một lớp con ScrollingWindow cung cấp cho chúng hoặc chúng ta có thể tạo một ScrollingWindowDecorator bổ sung chức năng này cho các đối tượng Window hiện có. Tại thời điểm này, một trong hai giải pháp sẽ ổn.
Bây giờ hãy giả sử rằng chúng tôi cũng mong muốn khả năng thêm viền vào cửa sổ của chúng tôi. Một lần nữa, lớp Window ban đầu của chúng tôi không có hỗ trợ. Lớp con ScrollingWindow hiện đặt ra một vấn đề, bởi vì nó đã tạo ra một loại cửa sổ mới một cách hiệu quả. Nếu chúng tôi muốn thêm hỗ trợ viền cho tất cả các cửa sổ, chúng tôi phải tạo các lớp con WindowWithBorder và ScrollingWindowWithBorder. Rõ ràng, vấn đề này trở nên tồi tệ hơn với mỗi tính năng mới được thêm vào. Đối với giải pháp trang trí, chúng ta chỉ cần tạo một BorderedWindowDecorator mới trong thời gian chạy, chúng ta có thể trang trí các cửa sổ hiện có với ScrollingWindowDecorator hoặc BorderedWindowDecorator hoặc cả hai, khi chúng ta thấy phù hợp.
OK, khi họ nói thêm viền cho tất cả các cửa sổ, tại sao không thêm chức năng vào lớp Window ban đầu để cho phép tùy chọn? Theo cách tôi thấy, phân lớp chỉ là để thêm chức năng cụ thể vào một lớp hoặc ghi đè một phương thức lớp. Nếu tôi cần thêm chức năng cho tất cả các đối tượng hiện có, tại sao tôi không sửa đổi siêu lớp để làm như vậy?
Có một dòng khác trong bài viết:
Mẫu trang trí là một thay thế cho phân lớp. Phân lớp thêm hành vi tại thời gian biên dịch và thay đổi ảnh hưởng đến tất cả các phiên bản của lớp gốc; trang trí có thể cung cấp hành vi mới trong thời gian chạy cho các đối tượng cá nhân.
Tôi không biết họ nói "... thay đổi ảnh hưởng đến tất cả các trường hợp của lớp ban đầu" - cách phân lớp thay đổi lớp cha? Không phải đó là toàn bộ điểm của phân lớp sao?
Tôi sẽ giả định rằng bài báo, giống như nhiều Wiki, không được viết rõ ràng. Tôi có thể thấy sự hữu ích của Trình trang trí trong dòng cuối cùng đó - "... cung cấp hành vi mới vào thời gian chạy cho các đối tượng riêng lẻ."
Nếu không đọc về mẫu này, nếu tôi cần thay đổi hành vi trong thời gian chạy cho các đối tượng riêng lẻ, tôi có thể đã xây dựng một số phương thức vào siêu lớp hoặc lớp con để bật / tắt hành vi nói. Xin hãy giúp tôi thực sự hiểu được sự hữu ích của Trình trang trí, và tại sao suy nghĩ của người mới của tôi là thiếu sót?