Khi nào cần sử dụng mẫu trang trí? Nếu có thể, hãy cho tôi một ví dụ về thế giới thực rất phù hợp với mô hình.Khi nào chúng ta cần mẫu trang trí?
Trả lời
Các luồng trong Java - các lớp con của InputStream
và OutputStream
là các ví dụ hoàn hảo về mẫu trang trí.
Như một ví dụ, viết một tập tin vào đĩa:
File toWriteTo = new File("C:\\temp\\tempFile.txt");
OutputStream outputStream = new FileOutputStream(toWriteTo);
outputStream.write("Sample text".getBytes());
Sau đó, bạn nên yêu cầu một số chức năng phụ liên quan đến việc viết vào đĩa:
File toWriteTo = new File("C:\\temp\\tempFile.txt");
OutputStream outputStream =
new GZIPOutputStream(new FileOutputStream(toWriteTo));
outputStream.write("Sample text".getBytes());
Bằng cách đơn giản là "chaining" các nhà thầu, bạn có thể tạo các cách viết khá mạnh mẽ vào đĩa. Vẻ đẹp theo cách này là bạn có thể thêm khác nhau (trong ví dụ này) OutputStream
triển khai sau này. Ngoài ra, mỗi lần triển khai không biết cách hoạt động của những người khác - tất cả đều hoạt động với cùng một hợp đồng. Điều này cũng làm cho việc thử nghiệm từng triển khai rất dễ dàng trong sự cô lập.
Có rất nhiều ví dụ "thực tế" về nơi có thể sử dụng mẫu trang trí. Off đỉnh đầu của tôi, một số ví dụ:
- Đọc và viết vào đĩa (ở trên)
- Xây dựng các yếu tố giao diện người dùng, chẳng hạn như thêm thanh cuộn vào vùng văn bản vv
Head First Design Các mẫu có một số ví dụ "thế giới thực" hơn.Có vẻ như O'Reilly có chương mẫu của họ, mà là trên mẫu Decorator, miễn phí; Google xuất hiện liên kết này: PDF
Có, java.io là hoàn toàn về Decorator. – duffymo
+1: ví dụ đáng yêu :) – Juliet
+1 Mặc dù tôi không coi việc sử dụng nặng nề mẫu trang trí trong java.io là 'đẹp'. Đó là một trong những lý do khác nhau mà tập tin io trong Java là một nỗi đau trong một **. – helpermethod
Hãy xem mô tả Fowler; nó đưa ra một ví dụ cụ thể liên quan đến sách/video và một người trang trí "mượn được", bạn có thể tìm thấy nó here.
Từ Gang of Four:
Một giao diện người dùng bộ công cụ đồ họa, ví dụ, sẽ cho phép bạn thêm các thuộc tính như biên giới hoặc các hành vi như di chuyển đến bất kỳ thành phần giao diện người dùng.
...
Các trang trí phù hợp với giao diện của các thành phần trang trí nó sao cho sự hiện diện của nó là trong suốt đối với khách hàng của bộ phận. Trình trang trí chuyển tiếp các yêu cầu đến thành phần và có thể thực hiện các tác vụ bổ sung (chẳng hạn như vẽ đường viền) trước hoặc sau khi chuyển tiếp. Tính minh bạch cho phép bạn lồng trang trí đệ quy, do đó cho phép số lượng không giới hạn các trách nhiệm bổ sung.
Giao diện người dùng thực tế có sử dụng loại trang trí này không? –
Nếu bạn đã quen với phát triển Swing trong Java (cùng với các bộ công cụ GUI khác), bạn sẽ thấy mẫu trang trí được sử dụng rất nhiều. Bạn có thể có một hàm tạo trong một thành phần cụ thể và sau đó thêm chức năng cho nó.
Mục đích của mô hình trang trí là:
Gắn trách nhiệm bổ sung cho một đối tượng tự động. Trang trí cung cấp một thay thế linh hoạt để phân lớp cho chức năng mở rộng. [qua Đầu tiên: Mẫu thiết kế]
Cách sử dụng nhiều nhất của mẫu trang trí là các lớp GUI và java.io. Có một chương miễn Head First: Design Patterns về trang trí hoa văn [link] mà cung cấp một số ví dụ khác:
Chúng tôi sẽ kiểm tra lại việc lạm dụng điển hình thừa kế và bạn sẽ học cách để decorate các lớp học của bạn vào thời gian chạy sử dụng một dạng thành phần đối tượng. Tại sao? Khi bạn biết kỹ thuật trang trí , bạn sẽ có thể cung cấp cho đối tượng của bạn (hoặc của người khác) mới trách nhiệm mà không thực hiện bất kỳ thay đổi mã nào cho lớp học cơ bản.
Bạn cũng có thể đọc Decorator Pattern by Example[PDF] trong đó Decorator Pattern được sử dụng trong một ứng dụng đánh giá.
Liên kết đầu tiên của PDF là 404. –
@ james.garriss: đã sửa –
Bạn hỏi cho một ví dụ thực tế, vì vậy ở đây bạn đi: tải về (hoặc duyệt) DonsProxy từ github:
git: //github.com/DonBranson/DonsProxy.git
DonsProxy cơ bản sử dụng mẫu WireTap để cho phép bạn xem hoặc trích xuất lưu lượng HTTP, cộng với nó cho phép bạn sửa đổi hành vi kết nối để mô phỏng các kết nối tối ưu. Tôi sử dụng mẫu Trang trí để sửa đổi kênh dựa trên tùy chọn của người dùng. Các tùy chọn dòng lệnh hoặc GUI (phụ thuộc vào Chế độ xem mà chúng đang sử dụng) cho phép chèn thời gian và chèn băng thông, trong số những thứ khác. Khi họ chèn thời gian chờ, điều đó sẽ thêm LatencyDecorator vào kênh; nếu họ điều chỉnh băng thông, điều đó sẽ thêm ThrottleDecorator vào kênh. Vì điều này sử dụng mẫu trang trí, chúng có thể kết hợp hành vi kết hợp với nội dung của trái tim.
Một trong những cách sử dụng tuyệt vời nhất - và hầu hết nghĩa đen tôi đã thấy là triển khai khả năng hoàn tác, quay lại những ngày cũ tồi tệ của hoàn tác một cấp. Đưa ra một chương trình vẽ vector, với một số đối tượng được chọn, có các màu khác nhau: thực hiện lệnh để thay đổi tất cả các màu của chúng. Và làm cho nó không thể thực hiện được. Điều này đã được thực hiện bằng cách áp dụng một Decorator, được gọi trong dòng getColor(), để khi chúng được vẽ, chúng được vẽ bằng màu mới; về cơ bản các phương thức getColor() của riêng các đối tượng đã bị loại bỏ. Vì vậy, họ xuất hiện trong màu sắc mới. Để hoàn tác cũng đơn giản như xóa Decorator khỏi tất cả các đối tượng; cam kết hành động là một vấn đề áp dụng màu sắc từ trang trí cho các đối tượng và sau đó loại bỏ nó. Đơn giản hơn nhiều so với việc giữ một bảng trong đó các đối tượng đã được tô màu và màu sắc ban đầu của chúng là gì.
Hai ví dụ thực tế:
Hệ thống nâng cấp mặt hàng trong Diablo 2 và Final Fantasy 7. Vũ khí và áo giáp có ổ cắm hoặc khe. Trong trò chơi, người chơi đặt nâng cấp (đá quý, rune hoặc materia) vào các khe đó.Mỗi lần nâng cấp có một hiệu ứng riêng (ví dụ, 8 điểm sát thương cháy hoặc 10% mana leech). Vì vậy, khi bạn vung thanh kiếm của mình, nó sẽ sát thương cơ bản cộng với sát thương được thêm vào bởi mỗi lần nâng cấp bạn đã thêm vào. Điều này phù hợp với mô hình trang trí rất chặt chẽ.
Được triển khai bằng mẫu trang trí? Dường như một danh sách các chiến lược cũng sẽ hoạt động. –
Khi nào cần sử dụng mẫu trang trí?
Sử dụng Decorator_pattern nếu
- trách nhiệm Object và hành vi nên được bổ sung động/gỡ bỏ
- triển khai bê tông nên được tách riêng từ trách nhiệm và hành vi
- subclassing là quá tốn kém để tự động thêm/gỡ bỏ trách nhiệm
Nếu có thể, hãy cho tôi một ví dụ về thế giới thực rất phù hợp với mô hình.
Tôi đã đưa ra Trang trí máy bán hàng tự động của riêng mình.
tuyên bố Vấn đề: Tính giá đồ uống (trà hoặc cà phê) bằng cách thêm một hoặc nhiều hương vị như đường, chanh, vv
Mã ví dụ và giải thích hiện có sẵn @
- 1. khi nào chúng ta cần mẫu Adapter?
- 2. MVC: tại sao chúng ta cần "điều khiển", hoặc khi nào chúng ta nên sử dụng mẫu này?
- 3. Khi nào chúng ta sử dụng ANTLR
- 4. Chúng ta có cần mfence khi sử dụng xchg
- 5. Khi nào chúng ta nên sử dụng lớp học và khi chúng ta không nên
- 6. Chúng ta vẫn cần AsyncEnumerator của Richter?
- 7. Tại sao chúng ta cần strdup()?
- 8. Khi nào chúng ta nên đóng EntityManagerFactory?
- 9. Tại sao chúng ta cần sợi
- 10. Tại sao chúng ta cần ng-click?
- 11. Khi nào chúng ta sử dụng "vị trí: tương đối" trong CSS?
- 12. Chúng ta có cần dấu chấm phẩy ở cuối?
- 13. Tại sao chúng ta cần một thẻ fieldset?
- 14. Khi nào chúng ta nên sử dụng mutex và khi nào chúng ta nên sử dụng semaphore
- 15. flexbox vs bảng, tại sao chúng ta cần flexbox?
- 16. Trình tự (Cơ sở dữ liệu) là gì? Khi nào chúng ta cần nó?
- 17. Tại sao chúng ta cần các Dịch vụ Web RESTful?
- 18. lý do tại sao chúng ta cần Hadoop cho hypertable
- 19. Tại sao chúng ta cần `Các gói đã nhập 'khi chúng ta có` Các trình cắm thêm cần thiết` trong các phụ thuộc trình cắm thêm eclipse?
- 20. Mẫu lưu trữ - Tại sao chính xác chúng ta cần Giao diện?
- 21. Khi nào chúng ta sẽ sử dụng applicationContext.xml trong Spring?
- 22. Trong trường hợp nào chúng ta sử dụng Mẫu Nhà máy và trong đó Mẫu Singleton?
- 23. Tại sao chúng ta cần DOCTYPE vào các trang HTML/JSP?
- 24. Phương thức mở rộng - Mẫu trang trí
- 25. chúng ta cần thuộc tính Serializable cho enums
- 26. Tại sao chúng ta cần funcall trong Lisp?
- 27. Tại sao chúng ta cần các nhà thầu tĩnh?
- 28. Biểu mẫu Zend Framework 2, chúng có loại bỏ mẫu trang trí không?
- 29. Tại sao chúng ta cần đặt khoảng trống trước% c?
- 30. Tại sao chúng ta cần ssh không mật khẩu Hadoop?
Bạn cần phải cho chúng tôi biết bạn cần làm gì nếu bạn muốn biết liệu một mẫu trang trí có hữu ích hay không, nếu bạn chỉ muốn một ví dụ chung, bạn chỉ cần tra cứu Mẫu trang trí trên wikipedia. –
[Mẫu thiết kế trang trí] (http://www.singhajit.com/decorator-design-pattern/) - cho biết khi nào chúng ta cần mẫu thiết kế với ví dụ thực tế đời sống –