2010-08-13 32 views
31

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í?

+1

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

+0

[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 –

Trả lời

50

Các luồng trong Java - các lớp con của InputStreamOutputStream 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

+3

Có, java.io là hoàn toàn về Decorator. – duffymo

+1

+1: ví dụ đáng yêu :) – Juliet

+1

+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

5

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.

8

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.

+0

Giao diện người dùng thực tế có sử dụng loại trang trí này không? –

1

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

Đây là a good article that uses Swing as an example.

3

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á.

+0

Liên kết đầu tiên của PDF là 404. –

+0

@ james.garriss: đã sửa –

1

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.

3

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ì.

20

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ẽ.

+0

Đượ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. –

0

Khi nào cần sử dụng mẫu trang trí?

Sử dụng Decorator_pattern nếu

  1. trách nhiệm Object và hành vi nên được bổ sung động/gỡ bỏ
  2. triển khai bê tông nên được tách riêng từ trách nhiệm và hành vi
  3. 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 @

When to Use the Decorator Pattern?

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