รูปแบบ 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 ทำหน้าที่เป็นตัวกลางระหว่างทั้งสอง ซึ่งช่วยให้สามารถบำรุงรักษาและทดสอบได้ง่ายขึ้น