Android 공부/디자인패턴

MVP 패턴 예시1

Machine_웅 2019. 9. 23. 21:32
728x90
반응형

<activity_main.xml>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".View.MainActivity">

    <TextView
        android:layout_marginLeft="20dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="이름 : "/>

    <TextView
        android:layout_marginLeft="20dp"
        android:layout_marginBottom="20dp"
        android:id="@+id/userId_text_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="없음"/>


    <TextView
        android:layout_marginLeft="20dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="나이 : "/>

    <TextView
        android:layout_marginLeft="20dp"
        android:layout_marginBottom="20dp"
        android:id="@+id/userAge_text_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="0"/>

    <Button
        android:id="@+id/getUserBtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="사용자 정보 가져오기"/>

</LinearLayout>

 

Contract ( view와 presenter가 구현해야할 인터페이스를 정의 )

public interface main_view_contract {

    /*
        MVP의 View가 구현할 인터페이스
        프레젠터가 View를  조작 할때 사용
    */
    interface View{
        void showToast(String message);
        void setText_userName(String name);
        void setText_userAge(int age);
    }


    /*
         MVP의 Presenter가 구현할 인터페이스
        View를 클릭 했을대 등 View가 Presenter에 알릴때 사용
    */
    interface userActoin{
        void setUserName(String name);
        void getUserName();
        void setUserAge(int age);
        void getUserAge();
    }
}

 

Presenter

( view에서 이벤트가 발생하면 presenter에 통보되고  prensenter가 model에서 데이터 처리를 한후  view를 조작 )

 

public class main_presenter implements main_view_contract.userActoin{

    private final main_view_contract.View View;
    private final main_model mm;


    public main_presenter(main_view_contract.View View,main_model mm) {
        this.View = View;
        this.mm = mm;
    }

    // 뷰에서 연락이 온 것을 프레젠터가 받아서 모델에 접근하여 데이터 처리하기.
    //  View (Event발생) -> presenter에 통보 -> presenter가 Model에서 데이터 가져옴, -> 다시 presenter가 View를 조작
    @Override
    public void setUserName(String name) {
        mm.setName(name);
        View.showToast("이름 변경");
    }

    @Override
    public void getUserName() {
        View.setText_userName(mm.getName());
        View.showToast("이름 가져옴");
    }

    @Override
    public void setUserAge(int age) {
        mm.setAge(age);
        View.showToast("나이 변경");
    }

    @Override
    public void getUserAge() {
        View.setText_userAge(mm.getAge());
        View.showToast("나이 가져옴");
    }

}

Model ( 비지니스 로직이 담겨져 있는 곳, )

 

public class main_model {

    private String name = "홍길동";
    private int age = 29;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

View ( 사용자에게 보여지는 화면을 나타내는 곳으로, 발생한 이벤트를 프레젠터에 전달한다  .)

( constract의 View 부분을 immplement 하여 구현하하여야 한다. )

 

public class MainActivity extends AppCompatActivity implements main_view_contract.View{

    public main_presenter mp;
    public main_model mm;
    public Button getUserData_Btn;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mm = new main_model();
        mp = new main_presenter((main_view_contract.View)this,mm);  //엑티비티에서 구현해야할 뷰의 인터페이스와, 모델을 가지고 인스턴스 생성

        mp.getUserName();
        mp.getUserAge();


        getUserData_Btn = (Button)findViewById(R.id.getUserBtn);
        // 버튼 이벤트
        getUserData_Btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mp.setUserName("유저이름");
                mp.setUserAge(34);
                mp.getUserName();
                mp.getUserAge();
            }
        });

    }

    // Presenter가 View를 조작할 때 이용한다 ( 프레젠터로 부터 받은 결과를 실행 , View 에서 구현 )
    @Override
    public void showToast(String message) {
        Toast.makeText(this,message,Toast.LENGTH_LONG).show();
    }

    @Override
    public void setText_userName(String name) {
        ((TextView)findViewById(R.id.userId_text_view)).setText(name);
    }

    @Override
    public void setText_userAge(int age) {
        ((TextView)findViewById(R.id.userAge_text_view)).setText(Integer.toString(age));
    }

}
728x90
반응형

'Android 공부 > 디자인패턴' 카테고리의 다른 글

1) MVVM 패턴  (0) 2020.01.30
MVP 패턴 정리1  (0) 2019.10.02