• Xamarin.Android MVP模式


    一、简介

    随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责。为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数 据的可视化以及与用户的交互,同时让Model只关系数据的处理,基于MVC概念的MVP(Model-View-Presenter)模式应运而生。

    在MVP模式里通常包含4个要素:

        View:负责绘制UI元素、与用户进行交互(在Android中体现为Activity);
        View interface:需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合,方便进行单元测试;
        Model:负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合);
        Presenter:作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。
    所谓的MVP,即是(model-处理业务逻辑(主要是数据读写,或者与后台通信(其实也是读写数据)),view-处理ui控件,presenter-主导器,操作model和view)

    二、实例

    1.新建一个项目,项目结构如下

    2.做一个根据id读取数据的实例,界面如下

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <EditText
            android:id="@+id/id"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="输入id"
            android:inputType="number" />
        <EditText
            android:id="@+id/first"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="inter first name"
            android:inputType="text" />
        <EditText
            android:id="@+id/last"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="inter last name"
            android:inputType="text" />
        <Button
            android:id="@+id/save"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="save" />
        <Button
            android:id="@+id/load"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="load" />
    </LinearLayout>
    View Code

    3.建立bean

     public class UserBean
        {
            private String mFirstName { get; set; }
            private String mLastName { get; set; }
              
            public UserBean(String firstName, String lastName)
            {
                this.mFirstName = firstName;
                this.mLastName = lastName;
            }
        }

    4.建立model(处理业务逻辑),先写接口,后写实现

        public interface IUserModel
        {
            void SetID(int id);
    
            void SetFirstName(String firstName);
    
            void SetLastName(String lastName);
    
            int GetID();
    
            UserBean Load(int id);// 通过id读取user信息,返回一个UserBean
        }
     public class UserModel : IUserModel
        {
            public int GetID()
            {
                return 0;
            }
    
            public UserBean Load(int id)
            {
                // 查数据库或者联网获取id的userbean
                return new UserBean("11", "22");
            }
    
            public void SetFirstName(string firstName)
            {
    
            }
    
            public void SetID(int id)
            {
    
            }
    
            public void SetLastName(string lastName)
            {
    
            }
        }

    5.建立view(更新ui中view状态),这里列出需要操作当前view的方法,也就是接口。

        public interface IUserView
        {
            int GetID();
    
            String GetFristName();
    
            String GetLastName();
    
            void SetFirstName(String firstName);
    
            void SetLastName(String lastName);
        }

    6.建立presenter(主导器,通过ivew和imodel接口操作model和view),activity可以把所有逻辑给presenter处理

     public class UserPresenter
        {
            private IUserView mUserView;
            private IUserModel mUserModel;
    
            public UserPresenter(IUserView view)
            {
                mUserView = view;
                mUserModel = new UserModel();
            }
    
            public void SaveUser(int id, String firstName, String lastName)
            {
                mUserModel.SetID(id);
                mUserModel.SetFirstName(firstName);
                mUserModel.SetLastName(lastName);
            }
    
            public void LoadUser(int id)
            {
                UserBean user = mUserModel.Load(id);
                mUserView.SetFirstName(user.mFirstName); // 通过调用IUserView的方法来更新显示
                mUserView.SetLastName(user.mLastName);
            }
        }

    7.activity中实现iview接口,在其中操作view,实例化一个presenter变量。

     public class MainActivity : Activity, IUserView, View.IOnClickListener
        {
            UserPresenter presenter;
            EditText id, first, last;
            protected override void OnCreate(Bundle bundle)
            {
                base.OnCreate(bundle);
    
                // Set our view from the "main" layout resource
                SetContentView(Resource.Layout.Main);
    
                // Get our button from the layout resource,
                // and attach an event to it
                 FindViewById<Button>(Resource.Id.save).SetOnClickListener(this);
                 FindViewById<Button>(Resource.Id.load).SetOnClickListener(this); ;
                
                id = FindViewById<EditText>(Resource.Id.id);
                first = FindViewById<EditText>(Resource.Id.first);
                last = FindViewById<EditText>(Resource.Id.last);
                presenter = new UserPresenter(this);
            }
    
            public int GetID()
            {
                return Convert.ToInt32(id.Text.ToString());
            }
    
            public string GetFristName()
            {
                return first.Text.ToString();
            }
    
            public string GetLastName()
            {
                return last.Text.ToString();
            }
    
            public void SetFirstName(string firstName)
            {
                first.Text = firstName;
            }
    
            public void SetLastName(string lastName)
            {
                last.Text = lastName;
            }
    
            public void OnClick(View v)
            {
                switch (v.Id)
                {
                    case Resource.Id.save:
                        presenter.SaveUser(GetID(), GetFristName(), GetLastName());
                        break;
                    case Resource.Id.load:
                        presenter.LoadUser(GetID());
                        break;
                }
            }
        }

    7.源码地址

     https://github.com/huguodong/XamarinMVP 

    里面又更详细的实例

  • 相关阅读:
    Python004-数据处理示例:以某个数据(字段)为基准从数据中获取不同的字段行数
    VUE-004-禁止修改页面显示项,设置el-input,textarea只读方法
    VUE-003-前端表格数据展示时,设置单元格(el-table-column)保留空格和换行
    cobaltstrike4.0 cracked
    CobaltStrike3.14破解
    CobaltStrike3.12/13 破解
    Windows 10 Manager v2.3.3
    MobaXterm v10.9破解
    Jupyter/JupyterLab安装使用
    WordPress <= 4.6 命令执行漏洞(PHPMailer)复现分析
  • 原文地址:https://www.cnblogs.com/huguodong/p/5929224.html
Copyright © 2020-2023  润新知