2013-05-28 37 views
6

Bộ điều khiển nhận danh sách một số Trái cây từ người dùng. Bộ điều khiển cần phải làm cho nước ép từ mỗi loại trái cây này. Một máy ép trái cây có thể làm cho nước trái cây ra khỏi cam và bưởi; một máy ép trái cây khác biết làm nước trái cây từ táo, chuối và đu đủ; và vân vân. Mỗi máy ép trái cây có thể chấp nhận nhiều trái cây trong một lần, nó sẽ chỉ xử lý các loại trái cây có khả năng và bỏ qua các trái cây khác bị ảnh hưởng. Vui lòng đề xuất một thiết kế phù hợp cho vấn đề này. Tôi đã cân nhắc các tùy chọn sau:Thiết kế mô hình lựa chọn tiến thoái lưỡng nan

  1. Cuộc gọi điều khiển MasterJuicer.juice(List<Fruit> fruits). MasterJuicer lần lượt gọi CitrusJuicer.juice(fruits)PulpyJuicer.juice(fruits).
  2. Chuỗi trách nhiệm có vẻ không đúng. Thứ tự mà Juicers được gọi là không quan trọng.
  3. Nhà máy? Bộ điều khiển gọi số JuicerFactory.getJuicers(List<Fruit> fruits) để nhận số List<Juicer>. Bộ điều khiển sau đó lặp lại từng máy ép trái cây và gọi Juicer.juice(fruits). Nó là phổ biến cho một nhà máy để trả lại một danh sách các trường hợp?
  4. Duy trì đăng ký Fruit vs. Juicer trong Map? Bộ điều khiển gọi FruitsRegistry.getJuicer(Fruit fruit) cho mỗi quả, sau đó gọi mỗi Máy ép trái cây trong một vòng lặp.

Trả lời

2

Một nhà máy có thể cung cấp máy ép trái cây chính xác, nhưng sau đó lôgic xử lý máy ép trái cây của bạn được đẩy tới bộ điều khiển của bạn.

A combination của các mẫu compositevisitor có thể hữu ích cho bạn.

  1. Các Composite Pattern sẽ cho phép bạn xây dựng một MasterJuicer rằng biết về juicers khác và có thể bắt đầu "quá trình ép" bằng cách ủy quyền cho juicers. Điều này xử lý các khía cạnh "cấu trúc" của vấn đề của bạn.
  2. Mẫu khách truy cập cho phép mỗi máy ép trái cây có phương pháp thống nhất để tương tác với họ mà không có người gọi (tổng hợp MasterJuicer) quan tâm đến cách họ làm việc cùng nhau. Điều này xử lý các khía cạnh "hành vi".

Bạn có thể chuyển danh sách thành phần để xử lý giữa mỗi khách truy cập để họ có thể tương tác với các loại trái cây mà họ quan tâm.

Nếu bạn không muốn đăng ký máy ép trái cây bằng MasterJuicer theo cách thủ công, bạn có thể muốn thông minh với một số loại khám phá dịch vụ.Một kỹ thuật phổ biến trong Java là sử dụng các chú thích và quét đường dẫn lớp để tìm các lớp trong thời gian chạy và tự động đăng ký chúng khi khởi động. Có a few libraries có sẵn để thực hiện việc này hoặc nếu bạn đã sử dụng Khung công tác Spring, bạn có thể sử dụng built-in scanning tools của khung công tác.

+0

Câu trả lời rất hấp dẫn. Tôi sẽ nhai qua những ý tưởng này một lúc và xem làm thế nào những lợi ích của kịch bản kinh doanh thực sự của tôi. Và cảm ơn cho các liên kết đến các công cụ quét classpath! – Somu

2

Tôi nghĩ là lựa chọn thứ ba là thích hợp nhất, mặc dù nhà máy phải có trách nhiệm trả lại máy ép trái cây thích hợp cho công việc - vì vậy nó không nên trả lại tất cả các juicers nhưng một trong những bạn cần cho công việc. Bản đồ có thể được bao gồm trong đó để giúp lựa chọn đúng.

Trường hợp này nhà máy chứa logic để chọn đúng máy ép trái cây chứ không phải bộ điều khiển.

+0

Như đã nêu trong câu hỏi, "nhiệm vụ" có thể yêu cầu nhiều hơn một Juicers tùy thuộc vào Danh sách trái cây. Trong lựa chọn số 3 của tôi, tôi không có nghĩa là Nhà máy sẽ trả lại tất cả các Juicers. Thay vào đó, Nhà máy sẽ quét Trái cây và chỉ trả lại những Juicers cần thiết để xử lý chúng. – Somu

+0

Ah, phải, xin lỗi. Sau đó, bạn đã viết đúng "triển khai". – ragatskynet

0

tôi đề nghị bạn Decorator Pattern

Ý tưởng chính là bạn có một máy ép trái cây cơ sở và bạn thêm nó chức năng khác.

Hy vọng điều đó sẽ hữu ích!

+0

Không có BaseJuicer (với chức năng mặc định hoặc thông thường) có thể được trang trí. Vui lòng mở rộng câu trả lời của bạn bằng mã để hiểu rõ hơn. – Somu

1

Đây chắc chắn là một chuỗi các trách nhiệm. Bằng cách nào đó lặp lại trên Juicers và tạo ra nước trái cây cho đến khi bạn ra khỏi trái cây. Một số điều cần xem xét là sự cần thiết phải pha trộn các loại nước quả (có thể là một mẫu tổng hợp trên Juice), và làm thế nào để sắp xếp ưu tiên (nếu hai juicers sẽ bưởi nước trái cây, mà nên nhận được để làm điều đó?). Đóng gói tất cả logic này sau giao diện Juicer.

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