Sử dụng ví dụ về trang trí cà phê được hiển thị trên Wikipedia (http://en.wikipedia.org/wiki/Decorator_pattern) Làm cách nào để một người có thể có các phương pháp mà chỉ những người trang trí có, ví dụ, trang trí sữa có thể có được gọi là "fatContent". Điều này có thể thực hiện được với kiểu thiết kế này không? Nếu không, tôi có thể sử dụng loại mẫu nào để thực hiện việc này?Mẫu trang trí với các phương pháp trang trí cụ thể trong Java
Trả lời
Mẫu trang trí theo định nghĩa không cho phép thêm các phương thức khác với các phương thức được xác định trong giao diện. Trên thực tế bạn luôn có thể thêm các phương thức vào bất kỳ lớp nào nhưng một khi các phương thức này không được định nghĩa trong máy khách giao diện thực hiện thì không thể gọi chúng bằng cách sử dụng giao diện này.
Giải pháp đơn giản cho vấn đề của bạn là xác định một số giao diện, ví dụ: Cà phê và sữa. Sau đó, bạn có thể xác định lớp Capuchino
thực hiện cả hai giao diện và có thể chứa 2 trường hợp: SimpleCofee
và FoamedMilk
. Nhưng giải pháp này trông giống như một sự kết hợp giữa Decorator và Facade.
Trình trang trí có thể có bất kỳ số phương pháp cụ thể nào. Bạn có thể giới thiệu một giao diện trang trí cụ thể mà người trang trí thực hiện ngoài việc triển khai giao diện trang trí. Tuy nhiên, ai đó phải biết các phương pháp đó tồn tại, do đó người trang trí phải gọi phương thức nội bộ, người gọi phải biết nó sử dụng một trang trí thay vì đối tượng được trang trí (bạn có thể kiểm tra bằng cách sử dụng instanceof
) hoặc sử dụng phản ánh kiểm tra những phương pháp đó.
Bạn thể, nhưng bạn cần phải biết loại để thực gọi phương pháp (giả sử không phản ánh vv) nếu nó không phù hợp với loại bạn đang đi qua xung quanh.
Các loại xác định những gì được biết tại thời gian biên dịch: nếu CoffeeDecorater
không bao gồm chữ ký fatContent
, không có gì nhận được phương thức tồn tại CoffeeDecoractor
.
Bạn có thể tạo giao diện bổ sung, nhưng bạn cần biết rằng giao diện đã tồn tại để bạn có thể kiểm tra (instanceof
) hoặc hỏi lớp để kiểm tra chữ ký (phản chiếu) cụ thể.
Java hoặc biết một phương thức tồn tại vào thời gian biên dịch hoặc kiểm tra nó khi chạy.
- 1. Phương thức mở rộng - Mẫu trang trí
- 2. Mẫu trang trí trong C++
- 3. Giảm boilerplate khi trang trí phương pháp
- 4. Phương pháp Java bị thiếu (ala Ruby) để trang trí?
- 5. Trang trí và phương pháp python
- 6. Thực hiện mẫu trang trí
- 7. Python: staticmethod trang trí recives phương pháp không thể gọi
- 8. Mẫu trang trí và @Inject
- 9. Trang trí một phương pháp đã là một classmethod?
- 10. Viết một trang trí lớp học mà áp dụng một trang trí cho tất cả các phương pháp
- 11. Chủ đề với trang trí
- 12. Thực hiện mẫu trang trí bằng Python
- 13. Áp dụng Mẫu trang trí cho các biểu mẫu
- 14. Áp dụng trang trí python với các phương pháp trong một lớp học
- 15. Python Phương pháp Định nghĩa Sử dụng trang trí
- 16. python @abstractmethod trang trí
- 17. Nhận tất cả các phương pháp được trang trí bằng một thuộc tính cụ thể sử dụng T4/EnvDTE
- 18. Sự khác biệt giữa trình trang trí Python và mẫu trang trí là gì?
- 19. Làm thế nào tôi có thể bước vào một phương pháp được trang trí với DebuggerStepThroughAttribute?
- 20. Đơn vị thử mẫu trang trí
- 21. Biểu mẫu Zend, trang trí bảng
- 22. python trang trí với javascript
- 23. Tại sao tôi cần phải trang trí decor_required trang trí với @method_decorator
- 24. Làm thế nào để trang trí các phương pháp Objective C với tài liệu?
- 25. Mẫu thiết kế trang trí so với kế thừa?
- 26. Ninject và trang trí
- 27. Trình trang trí giống như Python trong Java?
- 28. trang trí-c getter trang trí cho các giá trị boolean
- 29. Trang trí giao diện chung với Structuremap
- 30. thêm phương thức vào một lớp động với trang trí
Tôi không biết rằng mẫu thiết kế. Thành thật mà nói, tôi không thích nó. –
@MartijnCourteaux Ví dụ về cà phê của wikipedia được trích xuất từ cuốn sách [Não bộ của bạn trên các mẫu thiết kế] (http://headfirstlabs.com/books/hfdp/). Nhưng nó chỉ chứa một phần nhỏ mà không giải thích thêm. Tôi đề nghị bài giảng này để có cái nhìn toàn diện về mô hình. – Beccari
@MartijnCourteaux Decorator ?! Đó là một trong những mẫu * hữu ích nhất *, IMO. –