รูปแบบ mvp จะคล้ายกับ mvc คือ ถูกใช้เพื่อแยกการแสดงผลออกจากตรรกะการทำงาน โดยในรูปแบบ mvp ส่วนจัดการข้อมูล (module) จะจัดการข้อมูลพื้นฐานและตรรกะการทำงาน ส่วนแสดงผล (view) มีหน้าที่รับผิดชอบในการแสดงผลส่วนติดต่อผู้ใช้และการโต้ตอบกับผู้ใช้ ส่วนนำเสนอ (presenter หรือ controller ใน mvc) ทำหน้าที่เป็นสื่อกลางระหว่างส่วนจัดการข้อมูลและส่วนแสดงผล โดยรับข้อมูลจากส่วนแสดงผล อัปเดตส่วนจัดการข้อมูล และอัปเดตส่วนแสดงผลด้วยการเปลี่ยนแปลงจากส่วนจัดการข้อมูล
ลักษณะการทำงานของรูปแบบ mvp คือ ส่วนจัดการข้อมูลจะแจ้งเตือนการเปลี่ยนแปลงไปยังส่วนนำเสนอ (รูปแบบ mvc จะแจ้งไปยังส่วนแสดงผล) ผ่านสะพานข้อมูล (event bus) หรือที่เรียกกันว่าระบบส่งข้อความ (messaging system) ซึ่งทำหน้าที่จัดการการโต้ตอบระหว่างระบบงาน จากนั้นส่วนนำเสนอจึงจะติดต่อกับส่วนแสดงผล หรือเมื่อส่วนแสดงผลได้รับคำขอจากผู้ใช้งาน ส่วนแสดงผลจะติดต่อส่วนนำเสนอเพื่อให้ดำเนินการตามที่ผู้ใช้งานร้องขอ ซึ่งส่วนนำเสนอก็จะไปดำเนินการกับส่วนจัดการข้อมูลอีกทีหนึ่ง จะเห็นว่าส่วนแสดงผลไม่ได้ติดต่อกับส่วนจัดการข้อมูลโดยตรงดังเช่นรูปแบบ mvc
รูปแบบ mvp เป็นรูปแบบที่ทันสมัยกว่า mvc โดยถูกพัฒนาเพื่อให้รองรับการทดสอบได้ดียิ่งขึ้น โดยการลดรหัสโปรแกรมในส่วนแสดงผลและผลักดันให้ส่วนนำเสนอทำหน้าที่ให้มากขึ้น ดังนั้นในการออกแบบส่วนนำเสนอต้องระวังเรื่องความผูกพันกับส่วนติดต่อผู้ใช้เพราะจะทำให้การทดสอบยากขึ้น นอกจากนี้ส่วนนำเสนอก็ไม่ได้ส่งออบเจกต์ของข้อมูลไปให้กับส่วนแสดงผล แต่จะส่งเป็นชนิดข้อมูลพื้นฐาน (primitive data type) หรืออาเรย์ของข้อมูลพื้นฐานไปให้แทนและข้อมูลที่จะรับจากส่วนแสดงผลก็จะเป็นชนิดข้อมูลพื้นฐานเช่นเดียวกัน การที่ไม่ส่งออบเจกต์ของข้อมูลไปให้ส่วนแสดงผลทำให้ส่วนแสดงผลไม่มีข้อมูลมากมายเพื่อทำงานที่ซับซ้อน จึงไม่สามารถทำงานที่ซับซ้อนได้ ดังนั้นเรื่องยากๆจะต้องส่งข้อมูลไปให้ส่วนนำเสนอดำเนินการให้แทน ดังนั้นในการทดสอบสามารถทำได้ง่ายการใช้เพราะชนิดข้อมูลพื้นฐานทำให้เราสามารถทำการทดสอบแบบเปรียบเทียบกับผลลัพธ์ที่กำหนด (assertion test)ได้ง่าย และการโอนงานยากๆไปให้ส่วนนำเสนอทำให้โปรแกรมของส่วนแสดงผลมีขนาดเล็กและทำงานได้เร็ว
ข้อดีของรูปแบบ mvp คือ ช่วยให้เราแทบจะไม่ต้องทดสอบส่วนแสดงผล แต่ไปมุ่งทดสอบส่วนนำเสนอและส่วนจัดการข้อมูล การแจ้งเตือนและข้อมูลการเปลี่ยนแปลงที่แจ้งผ่านระบบส่งข้อความช่วยเป็นแบบส่งให้ (push) ซึ่งส่วนนำเสนอไม่ต้องวนกลับมาสอบถามจากส่วนจัดการข้อมูลดังเช่นในรูปแบบ mvc ข้อด้อยคือรูปแบบนี้ทำให้ส่วนนำเสนอใหญ่และซับซ้อนซึ่งเราอาจจะต้องพิจารณาว่าสามารถแบ่งออกเป็นหลายๆออบเจกต์ๆได้หรือไม่
ตัวอย่างโปรแกรมในภาษาจาวา
ขั้นแรก ให้กำหนดอินเทอร์เฟซสำหรับ model, view และ presenter
public interface Model {
String fetchData();
}
public interface View {
void displayData(String data);
}
public interface Presenter {
void loadData();
}
ต่อไปมาปรับใช้ model
public class MyModel implements Model {
@Override
public String fetchData() {
// Fetch data from a data source (e.g. database, API)
return “Hello World!”;
}
}
จากนั้นมาปรับใช้ view
import javax.swing.*;
public class MyView implements View {
private JFrame frame;
private JLabel label;
public MyView() {
frame = new JFrame(“MVP Example”);
label = new JLabel();
frame.getContentPane().add(label);
frame.pack();
frame.setVisible(true);
}
@Override
public void displayData(String data) {
label.setText(data);
}
}
สุดท้าย เรามาใช้งาน presenter กัน
public class MyPresenter implements Presenter {
private Model model;
private View view;
public MyPresenter(Model model, View view) {
this.model = model;
this.view = view;
}
@Override
public void loadData() {
String data = model.fetchData();
view.displayData(data);
}
}
ตอนนี้ เราสามารถใช้คลาสเหล่านี้ในเมธอดหลักของเราได้
public static void main(String[] args) {
Model model = new MyModel();
View view = new MyView();
Presenter presenter = new MyPresenter(model, view);
presenter.loadData();
}
เมื่อเรียกใช้เมธอด loadData() บน presenter เมธอดจะดึงข้อมูลจาก model และส่งต่อไปยัง view เพื่อแสดง ด้วยวิธีนี้ตรรกะทางธุรกิจ (model) จะแยกออกจากตรรกะของส่วนติดต่อผู้ใช้งาน (view) และ presenter ทำหน้าที่เป็นตัวกลางระหว่างทั้งสอง ซึ่งช่วยให้สามารถบำรุงรักษาและทดสอบได้ง่ายขึ้น