2012-09-17 38 views
6

Như tôi biết trong việc thực hiện tiêu chuẩn của MVC, chúng tôi vượt qua Bộ điều khiển và Mô hình cho Chế độ xemMVC - tôi có cần sử dụng Bộ điều khiển trong Chế độ xem không?

Nhưng Im hơi không đồng ý với ý tưởng này. Tôi không muốn quan điểm của tôi để biết về cả hai bộ điều khiển và mô hình (oh no. Có thể đôi khi xem nhu cầu mô hình, nhưng tôi chắc chắn rằng ông có thể sống mà không có kiến ​​thức về bộ điều khiển)

Theo ý kiến ​​của tôi nên quản lý Xem và mô hình, và Model không cần biết về bộ điều khiển và khung nhìn; xem doesnt cần phải biết điều khiển (Tôi không loại trừ mô hình vì một số triển khai quan điểm cần phải biết về mô hình để lắng nghe những thay đổi trong mô hình). Ý tưởng của tôi là chế độ xem không cần biết về bộ điều khiển.

1. Dưới đây là một ví dụ:

public class MyView implements ButtonClickListener { 

    private Controller myController; 
    private Button myButton; 

    // I commented out the model because we dont need it now 
    // we are talking about using controller in the view 

    public MyView(Controller c/*, Model m*/) { 
     myController = c; 
     myButton  = new Button(); // lets say that it is "register" button 
     myButton.setOnButtonClickListener(this); 
    } 

    public void setRegisterButtonText(String text) { 
     myButton.setText(text); 
    } 

    @Override 
    public void onClick() { 
     myController.tellToModelToDoSomething(); 
    } 

} 

Và Bộ điều khiển:

public MyController implements Controller { 

    private Model model; 
    private View view; 

    public MyController(Model model) { 

      this.model = model; 
      this.view = new MyView(this); 

    } 

    public void tellToModelToDoSomething() { 
      model.doSomeActions(); 
    } 


} 

2. Và bây giờ làm thế nào để tôi thấy thực hiện điều này mà không đi qua bộ điều khiển:

Xem của tôi:

public class MyView { 

    private Button myButton; 

    public MyView() { 
     myButton = new Button(); 
    } 

    public void setRegisterButtonText(String text) { 
     myButton.setText(text); 
    } 

    public void setOnRegisterButtonClick(final Command command) { 
     myButton.setOnButtonClickListener(new ButtonClickListener() { 
          @Override 
          public void onClick() { 
           command.execute(); 
          } 
         }); 
    } 

} 

"Command" giao diện:

public interface Command { 

    void execute(/*also can handle extra params*/); 

} 

Và Bộ điều khiển:

public MyController implements Controller { 

private Model model; 
private View view; 

public MyController(Model model) { 

     this.model = model; 
     this.view = new MyView(); 

     view.setOnRegisterButtonClick(command); 

} 

public void tellToModelToDoSomething() { 
     model.doSomeActions(); 
} 

private Command command = new Command() { 

    public void execute() { 
      tellToModelToDoSomething(); 
    } 

}; 

}

Vậy tại sao tôi nghĩ rằng việc sử dụng bộ điều khiển trong giao diện LÀ KHÔNG TỐT:

Chúng tôi đang trộn bộ điều khiển và xem triển khai, tạo phụ thuộc mới.

Ngoài ra, tôi nghĩ rằng Chế độ xem chỉ nên chứa VIEWS và hoạt động với chúng (và sử dụng bộ điều khiển và một số phương pháp của anh ta đã có dạng logic).

Trong chế độ xem ví dụ đầu tiên, hãy cho bộ điều khiển biết phải làm gì. Bạn có đồng ý không? Có vẻ như điều khiển xem bộ điều khiển!

Trong bộ điều khiển ví dụ thứ hai kiểm soát phải làm gì và chỉ nói với quan điểm phải làm gì nếu một số nút (chỉ xem biết nút gì nó sẽ được) nhấp

tôi luôn luôn sử dụng các chương trình thứ hai, nhưng sau khi đọc một cuốn sách mới về mvc, mà nói rằng chúng ta cần phải vượt qua bộ điều khiển để xem, tôi là một chút bối rối.

Bạn có thể vui lòng giúp tôi hiểu tại sao tôi sai và cho tôi xem một số ví dụ?

+0

tôi tin rằng bộ điều khiển và chế độ xem không tương tác trực tiếp. Họ tương tác mặc dù mô hình. do đó, mô hình biết cả bộ điều khiển và chế độ xem nhưng chế độ xem và bộ điều khiển không biết lẫn nhau. – gigadot

+2

đã nói điều đó. MVC có nhiều biến thể và sự thực tế khác nhau trong thực tế. – gigadot

+0

bạn đúng .., và làm thế nào bạn nghĩ trong ví dụ này, việc thực hiện nào tốt hơn? – pleerock

Trả lời

11

Không có tiêu chuẩn MVC, vì có nhiều triển khai. Đây là một giải thích của MVC được dạy trong nhiều sách giáo khoa:

Định nghĩa của bộ điều khiển trong giải thích này là nó xử lý các sự kiện từ khung nhìn, vì vậy khung nhìn phải sử dụng bộ điều khiển.

Trong MVC chuẩn, mô hình chứa và hiển thị dữ liệu, bộ điều khiển thao tác mô hình và chấp nhận các sự kiện từ khung nhìn, và khung nhìn trình bày mô hình và tạo sự kiện cho bộ điều khiển.

MVC được coi là một hệ thống giao dịch, trong đó một giao dịch được khởi xướng bởi sự kiện. Giao dịch thường trông giống như sau:

  1. Sự kiện (chẳng hạn như một lần nhấp nút) được tạo trên chế độ xem.
  2. Thông tin sự kiện được chuyển từ chế độ xem tới bộ điều khiển.
  3. Bộ điều khiển gọi các phương thức trên mô hình để thay đổi nó (các trình cài đặt và các phương thức thao tác khác có thể cập nhật một số cơ sở dữ liệu).

Các bước đầu tiên thể hiện liên kết V-C và liên kết M-C. V-C tồn tại vì các sự kiện được chuyển từ dạng xem sang bộ điều khiển sẽ được xử lý thay vì chế độ xem xử lý chúng trực tiếp. Liên kết M-C tồn tại vì mô hình được cập nhật bởi bộ điều khiển theo sự kiện đã được kích hoạt.

Từ đây, có hai đường dẫn. Người đầu tiên:

  1. Giao dịch kết thúc.
  2. Riêng biệt, mô hình kích hoạt các sự kiện riêng của mình để biểu thị sự kiện đã thay đổi.
  3. Chế độ xem đang lắng nghe mô hình và nhận sự kiện và cập nhật mô hình đại diện mô hình của nó để phản ánh các thay đổi.

Đường dẫn đầu tiên này thể hiện một cách giải thích liên kết M-V. Liên kết M-V là 1) chế độ xem nhận thông tin từ mô hình cho dữ liệu của nó và 2) mô hình yêu cầu khung nhìn cập nhật vì nó đã được sửa đổi.

Đường dẫn thứ hai chỉ là một bước: khi bộ điều khiển đã xử lý sự kiện, chế độ xem sẽ cập nhật ngay lập tức bằng cách đơn giản làm mới tất cả các phần tử giao diện người dùng của nó. Cách giải thích này của liên kết M-V là mô hình đơn giản cung cấp thông tin của nó cho khung nhìn, giống như điểm số 1 từ liên kết M-V trong đường dẫn đầu tiên ở trên.

Dưới đây là một số mã của bạn sửa đổi cho kiến ​​trúc MVC tôi đã mô tả:

public class MyView implements View, ModelListener { 

    private Button myButton; 
    private Controller controller; 

    public MyView(Controller controller, Model model) { 
     myButton = new Button(); 
     myButton.setOnButtonClickListener(new ButtonClickListener() { 
      @Override 
      public void onClick() { 
       controller.onRegisterButtonClick(); 
      } 
     }); 
     this.controller = controller; 
     model.addModelListener(this); 
    } 

    public void setRegisterButtonText(String text) { 
     myButton.setText(text); 
    } 

    public void modelUpdated(Model model) { 
     // Update view from model 
    } 
} 

Và bộ điều khiển:

public MyController implements Controller { 

    private Model model; 
    private View view; 

    public MyController(Model model) { 
     this.model = model; 
     this.view = new MyView(this, model); 
    } 

    private void manipulateModel() { 
     model.doSomeActions(); 
    } 

    public void onRegisterButtonClick() { 
     maniuplateModel(); 
    } 
} 

Sau đó mô hình:

public class MyModel implements Model { 
    private List<ModelListener> modelListeners = new ArrayList<ModelListener>(); 

    public void addModelListener(ModelListener ml) { 
     if (!modelListeners.contains(ml)) { 
      modelListeners.add(ml); 
     } 
    } 

    public void removeModelListener(ModelListener ml) { 
     modelListeners.remove(ml); 
    } 

    public void doSomeActions() { 
     // Do something 
     fireUpdate(); 
    } 

    private void fireUpdate() { 
     // Iterates backwards with indices in case listeners want to remove themselves 
     for (int i = modelListeners.size() - 1; i >= 0; i-- { 
      modelListener.modelUpdated(this); 
     } 
    } 
} 

ModelListener là khá đơn giản:

public interface ModelListener { 
    void modelUpdated(Model model); 
} 

Đây chỉ là một cách diễn giải. Nếu bạn muốn tách biệt hơn nữa giữa các phần khác nhau, bạn nên nhìn vào Presentation, Abstraction, Control (PAC) pattern. Nó được tách rời hơn MVC, và cũng tuyệt vời cho các hệ thống phân tán. Đó là quá mức cần thiết cho các ứng dụng web, di động, máy tính để bàn đơn giản, nhưng một số ứng dụng máy khách/máy chủ và hầu hết các ứng dụng đám mây có thể hưởng lợi từ phương pháp này.

Trong PAC, bạn có ba phần, bản trình bày, trừu tượng và kiểm soát, nhưng sự trừu tượng và bản trình bày (mô hình và chế độ xem) không tương tác với nhau.Thay vào đó, thông tin chỉ chuyển vào và ra khỏi mô-đun điều khiển. Hơn nữa, bạn có thể có nhiều mô-đun phụ PAC chỉ tương tác với nhau thông qua các điều khiển của chúng, cho chính nó vào một mô hình tốt cho các hệ thống phân tán. Về cơ bản, mô-đun điều khiển là trung tâm chính của bất kỳ truyền dữ liệu nào.

Về cơ bản, việc diễn giải MVC của bạn có thể khác với bản thân tôi hoặc của họ. Điều quan trọng là bạn chọn một mẫu kiến ​​trúc và theo dõi nó để giữ cho mã của bạn có thể duy trì được trong tương lai. Và bạn nói đúng là có nhiều cách để giải mã MVC hơn nữa. Trên thực tế, ví dụ của bạn hơi giống PAC, nhưng thay vì xóa liên kết V-C, nó sẽ loại bỏ liên kết M-V.

Trong mọi trường hợp, hãy làm theo một kiến ​​trúc, tài liệu kiến ​​trúc của bạn (để mọi người biết giải thích của bạn là gì), và đừng đi lạc.

+0

Cảm ơn bạn đã phản hồi. Tôi đánh giá cao lời khuyên của bạn và sẽ tìm hiểu thêm về mẫu PAC – pleerock

+0

Ai sẽ thêm 'khung nhìn' trong ArrayList' modelListeners' vào lớp 'MyModel'? Điều đó sẽ được thực hiện trong 'MyController' trong lớp' MyController' bạn sẽ làm 'mô hình. addModelListener (xem) '? – CapturedTree

+1

Chắc chắn, tôi nghĩ rằng bộ điều khiển sẽ là nơi thích hợp trong ví dụ này có. Vì vậy, trong bộ điều khiển constructor: 'model.addModelListener (view);' Tùy chọn, bạn có thể có giao diện 'View' mở rộng' ModelListener' để bạn biết nó sẽ luôn là một người nghe. Hoặc có giao diện 'View' thực hiện một phương thức trả về' ModelListener' của nó. Có rất nhiều lựa chọn. Như tôi đã nói, hãy chọn một triển khai và gắn bó với nó :) – Brian

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