2012-09-21 7 views
15

Tôi hiện đang đọc http://addyosmani.com/resources/essentialjsdesignpatterns/book/#mediatorpatternjavascriptViệc sử dụng mẫu hòa giải có đề xuất không?

Tôi hiểu mẫu dàn xếp như một loại đối tượng nào đó thiết lập chức năng xuất bản và đăng ký.

Thông thường tôi đang thiết lập các đối tượng đã cung cấp phương thức đăng ký(), xuất bản(). Đối tượng Concrete mở rộng đối tượng cơ sở này để subscribe() và publish() luôn được đăng ký như là các thuộc tính prototype.

Khi tôi hiểu đúng mẫu hòa giải được sử dụng để thêm phương thức xuất bản-đăng ký vào đối tượng.

Lợi ích của phương pháp này là gì? Nó không phải là một thực hành tốt hơn để cung cấp một đối tượng cơ sở với các chức năng xuất bản và đăng ký hơn là cho phép một người hòa giải thiết lập tại xây dựng?

Hoặc tôi có hiểu mô hình hòa giải sai không?

Trân

Trả lời

19

Như những gì tôi đã học được từ bài viết tương tự một số thời gian trước đây:

  • Các mô hình trung gian cung cấp một API chuẩn cho mô-đun để sử dụng.

    Hãy có một ví dụ: hàng ngàn

    của ứng dụng của bạn của module nặng nề dựa vào jQuery $.post. Nếu đột nhiên, công ty của bạn có vấn đề cấp phép và quyết định chuyển sang, ví dụ: MooTools hoặc YUI, giao diện của bạn cho tất cả mã có sử dụng $.post và thay thế chúng bằng một cái gì đó như MooTools.post?

    Mẫu hòa giải giải quyết cuộc khủng hoảng này bằng cách chuẩn hóa API. Những gì các mô-đun biết là người hòa giải của bạn có chức năng đăng bài có thể thực hiện bài đăng AJAX bất kể thư viện nào được sử dụng.

    //module only sees MyMediator.post and only knows that it does an AJAX post 
    //How it's implemented and what library is used is not the module's concern 
    
    jQuery.post -> MyMediator.post -> module 
    MooTools.post -> MyMediator.post -> module 
    YUI.post  -> MyMediator.post -> module 
    
  • Trình trung gian đóng vai trò là "trung gian" cho truyền thông đa thức.

    Một vấn đề trong phát triển JS của newbie là khi các mô đun phụ thuộc lẫn nhau. Đó là khi:

    MyClassA.something = MyClassB.method(); 
    MyClassB.something = MyClassA.method(); 
    

    Nhưng điều gì sẽ xảy ra nếu xảy ra sự cố trong số MyClassB và nhà phát triển đã lấy nó ra khỏi tòa nhà. Bạn sẽ tìm kiếm và loại bỏ tất cả các mã trong MyClassA sử dụng MyClassB để nó không bị phá vỡ do sự vắng mặt của MyClassB?

    Mẫu hòa giải publishsubscribe mô hình giải quyết vấn đề này bằng cách làm cho mô-đun đăng ký sự kiện thay vì trực tiếp giao tiếp với các mô-đun khác. Người hòa giải hoạt động như một bộ sưu tập các cuộc gọi lại/đăng ký được kích hoạt khi các sự kiện được xuất bản.

    Kết quả đăng ký "ẩn danh" này trong một phần khớp nối lỏng lẻo. Mô-đun vẫn cần biết mô-đun nào cần nghe hoặc ít nhất một tập hợp các sự kiện để nghe, nhưng chúng được kết nối theo cách sẽ không dẫn đến vỡ nếu có bất kỳ một trong số chúng được lấy ra.Tất cả những gì họ biết là họ đã đăng ký sự kiện và sẽ thực thi khi sự kiện đó xảy ra - bất kể ai bắn nó, nếu nó cháy, hoặc nếu kích hoạt tồn tại.

+0

Liệu Hòa giải viên đăng ký của mình xuất bản và đăng ký chức năng để một đối tượng trong các nhà xây dựng? Tại sao tôi không thể sử dụng một người hòa giải toàn cầu cho tất cả các sự kiện? Không phải người hòa giải phải là một singleton khi sử dụng ví dụ requirejs? – bodokaiser

+1

@kyogron Có, người hòa giải giống như một singleton thu thập đăng ký và kích hoạt chúng khi được gọi. Nhưng có những lý do tại sao bạn sẽ có nhiều hơn một hòa giải viên. Tôi đề nghị bạn xem [video của Nicholas Zakas] (http://www.youtube.com/watch?v=vXjVFPosQHw) về chủ đề này cho rõ ràng (ông có các slide và sơ đồ) cũng như [thư viện KernelJS] (http : //alanlindsay.me/kerneljs/) thực hiện mẫu này. – Joseph

+1

@JosephtheDreamer Trong ví dụ của bạn, tôi có cảm giác rằng nó là một khuôn mặt khá hơn so với người hòa giải? Tôi có nhớ gì không? – hguser

2

Bạn có thể đạt được hòa giải mà không cần sử dụng sự kiện (pub/sub). Trong các luồng phức tạp/tinh vi, có thể khó khăn để gỡ lỗi hoặc lý do về mã mà hoàn toàn là sự kiện điều khiển.

Đối với một ví dụ về cách bạn có thể tạo một người hòa giải mà không pub/sub, bạn có thể có một cái nhìn tại jQueryMediator dự án của tôi: https://github.com/jasonmcaffee/jQueryMediator