2011-12-27 34 views
6

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

+0

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ó. –

+0

@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

+1

@MartijnCourteaux Decorator ?! Đó là một trong những mẫu * hữu ích nhất *, IMO. –

Trả lời

3

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: SimpleCofeeFoamedMilk. 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.

4

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 đó.

9

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.

Các vấn đề liên quan