2011-01-25 52 views
8

Đối với những người đã quen thuộc với mô hình Trung Gian ...Thực hiện mô hình Mediator trong Delphi mà không nhận được tài liệu tham khảo tròn

Tôi muốn thực hiện mô hình Mediator trong Delphi, nhưng trình biên dịch Delphi không thể xử lý các tài liệu tham khảo tròn cần thiết.

Nhìn vào biểu đồ GOF ban đầu từ 'Mẫu thiết kế', Người hòa giải có tham chiếu đến từng đồng nghiệp, nhưng nhiều đối tượng đồng nghiệp có tham chiếu lại cho Người hòa giải.

Đây không phải là một vấn đề trong hầu hết các ngôn ngữ, nhưng trình biên dịch Delphi của tôi là đem lại cho tôi 'F2047 Thông tư đơn vị tham chiếu đến ...'

Sẽ this approach, sử dụng giao diện, hãy sử dụng bất kỳ? (Có vẻ phức tạp)

Tôi đang sử dụng Delphi 2010

[Tóm tắt các giải pháp]

Chỉ cần tóm tắt các câu trả lời được chấp nhận: Trong ngôn ngữ cho phép tham chiếu vòng tròn, bạn có thể bỏ lớp Mediator trừu tượng (như được thảo luận trong phần "Thực hiện" của GoF ở trang 278). Cách duy nhất bạn có thể thực hiện hòa giải viên tại Delphi mà không có một lớp hòa giải trừu tượng là có tất cả các lớp học của bạn trong một đơn vị.

Nếu không, bạn cần thêm lớp cơ sở Dàn xếp trừu tượng ngoài lớp con cụ thể.

Sử dụng của bạn khoản cho ba đơn vị sẽ trông như thế này:

ConcreteColleage1 Sử dụng Mediator
ConcreteMediator Sử dụng Mediator, ConcreateColleague1
Mediator (Không sử dụng một trong hai)

Không tham chiếu vòng tròn!

Trả lời

5

Tôi không thấy nơi phụ thuộc vòng tròn phát sinh. Nếu bạn triển khai các lớp học của mình theo sau this diagram, sẽ không có điều gì xảy ra.

Để thực hiện sơ đồ này trong Delphi, bạn sẽ thực sự cần phải viết

  • hoặc là một giao diện Mediator (và có lớp ConcreteMediator của bạn thực hiện giao diện này)
  • hoặc một lớp cơ sở Mediator với các phương pháp ảo, (và có lớp học ConcreteMediator của bạn lấy từ Mediator và ghi đè các phương pháp này).
+0

Tôi đang đề cập đến mẫu hòa giải như được mô tả trong sách Thiết kế mẫu của GoF. Cụ thể, sơ đồ trên trang 274. 'aButton' có tham chiếu đến 'aFontDialogDirector' và ngược lại, 'aFontDialogDirector' có tham chiếu đến 'aButton'. Vì vậy, trong Delphi, hai lớp này phải ở trong cùng một Đơn vị. – awmross

+0

Sau khi đọc câu trả lời của bạn cẩn thận hơn, bây giờ tôi thấy điều này là đúng. Tôi phải tạo ra một lớp trung gian cơ sở trong một đơn vị và phân lớp nó trong một đơn vị khác. Nếu bạn chỉnh sửa câu trả lời của mình, tôi có thể thay đổi câu trả lời của tôi thành câu trả lời :-) – awmross

7

Sử dụng giao diện chắc chắn có thể giúp giảm sự phụ thuộc giữa các đơn vị. Một cách tiếp cận khác là có các lớp cơ sở trừu tượng xác định các phương thức tương tác giữa các lớp và sau đó đặt con cháu cụ thể vào các đơn vị riêng biệt.

Xem: How to avoid circular unit reference? để biết thêm thông tin về cách tránh tham chiếu tuần hoàn ở Delphi.

2

Một tùy chọn khác cần xem xét là đặt Người hòa giải và Đồng nghiệp vào cùng một đơn vị. Trong nhiều tình huống đó là cách Delphi thành ngữ để tránh tham chiếu vòng tròn.

Sử dụng interfaces thường là một cách tiếp cận tốt cho loại vấn đề này nhưng đôi khi nó có thể dẫn đến sự phức tạp thêm cho không có lợi ích thực sự.

Thật khó để biết sự cân bằng sẽ rơi vào đâu đối với mã của bạn vì vậy tôi không muốn nói rằng cách tiếp cận này tốt hơn phương pháp khác như quy tắc chung.

+0

Vì tôi đang cố gắng chia nhỏ một tệp 5000 dòng, việc giữ các lớp trong cùng một Đơn vị không giúp tôi nhiều. Nhưng trong các tình huống khác, đây sẽ là một giải pháp khả thi. – awmross

+2

@awmross 5000 dòng ?! Đó là không có gì, lớn nhất của tôi có 32.000 dòng. Nghiêm trọng hơn, chia nhỏ các tệp lớn thường là một ý tưởng hay, nhưng luôn luôn có một điểm khi nó làm mọi thứ tồi tệ hơn bằng cách giữ những thứ liên quan chặt chẽ với nhau. Dù sao, tôi chắc chắn bạn cũng nhận thức được điều này. –

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