Android Mvc 模式

1.Mvc 介绍

   Model-View-Controller(模型-视图-控制器) 模式,这种模式用于应用程序的分层开发。
   model:模型层主要是处理数据的,主要进行网络请求,复杂的数据操作
   view:视图层xml 负责数据的显示,主要是xml,View负责
   controller:控制层处理用户交互的部分,负责从视图层获取数据传递给模型层进行处理activity,Fragment和Adapter充当这个角色

如图:

2.Android中demo

(1).代码的目录结构:

(2).model层:

public interface GetDataModelImpl {
    public void getData(String url, GetDataListener listener);
}
public class GetDataModel implements GetDataModelImpl {
    @Override
    public void getData(String url, final GetDataListener listener){
        OkHttpClient client = new OkHttpClient(
        final Request request = new Request.Builder()
                .url(url).addHeader("Content-Type","application/json")
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                listener.onFail();
            }
​
            @Override
            public void onResponse(Call call, final Response response) throws IOException {
                final String resultStr = response.body().string();
                Handler mainHandler = new Handler(Looper.getMainLooper());
                mainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        //已在主线程中,更新UI
                        if(response.isSuccessful()){//回调的方法执行在子线程。
                            listener.onSuccess(resultStr);
                        }else{
                            listener.onFail();
                        }
                    }
                });
​
​
            }
​
​
​
        });
    }
}

(3).view层

<?xml version="1.0" encoding="utf-8"?>
<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"
    >
​
    <Button
        android:id="@+id/bt0"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="mvc1获取数据"></Button>
    <Button
        android:id="@+id/bt1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="mvc2获取数据(变相的)"></Button>
    <Button
        android:id="@+id/bt2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="没有用mvc模式的"></Button>
    <TextView
        android:id="@+id/tv"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:text="返回的结果"></TextView>
​
</LinearLayout>

(4).controller层

public class MainActivity extends FragmentActivity implements GetDataListener {
    private GetDataModelImpl getDataModel;
    private Button bt0;
    private Button bt1;
    private Button bt2;
    private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bt0 = (Button)findViewById(R.id.bt0);
        bt1 = (Button)findViewById(R.id.bt1);
        bt2 = (Button)findViewById(R.id.bt2);
        tv = (TextView)findViewById(R.id.tv);
​
        bt0.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String url = "https://www.baidu.com/";
                getDataModel.getData(url,MainActivity.this);
​
            }
        });
        bt1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //换一种形态的mvc模式这个时候只不过是没有回调lister,但是方法返回值里面有也属于mvc模式
                int number = UtilTools.parseInt("2");
                Toast.makeText(getApplicationContext(),"获取的数据"+ number,Toast.LENGTH_LONG).show();
            }
        });
        bt2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //没有mvc模式 数据处理的能力都在activity层也就是Controller层
                //这样造成activity 有控制层的能力也有model层的数据处理的能力,导致activity代码量很大
                String url = "https://www.baidu.com/";
                getData(url,MainActivity.this);
            }
        });
        if(getDataModel == null){
            getDataModel = new GetDataModel();
        }
    }
​
    @Override
    public void onSuccess(String data) {
        if(!TextUtils.isEmpty(data)){
            tv.setText(data);
        }else{
            tv.setText("请求的结果为空");
        }
​
    }
​
    @Override
    public void onFail() {
        tv.setText("---请求的结果失败--");
    }
    public void getData(String url, final GetDataListener listener){
        OkHttpClient client = new OkHttpClient();
        final Request request = new Request.Builder()
                .url(url).addHeader("Content-Type","application/json")
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                listener.onFail();
            }
​
            @Override
            public void onResponse(Call call, final Response response) throws IOException {
                final String resultStr = response.body().string();
                Handler mainHandler = new Handler(Looper.getMainLooper());
                mainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        //已在主线程中,更新UI
                        if(response.isSuccessful()){//回调的方法执行在子线程。
                            listener.onSuccess(resultStr);
                        }else{
                            listener.onFail();
                        }
                    }
                });
​
​
            }
​
​
​
        });
    }
}

(5).git 下载地址GitHub - wyc1411162011/MvcDemo: mvc模式的实例

3.优缺点总结:
优点:mvc采取分层结构结构清晰明了,各个层级分工明确耦合性低

缺点:(1).mvc模式activity充当view和controller这两种角色,随着项目扩大activity里面代码会很多,不适用 复杂的页面
           (2).view层和model层有交互,有代码的耦合。
           (3).model层数据操作没有和activity生命周期绑定,activity结束model数据处理还会有回调,容易引起context的内存溢出

4.问题及解答:
           (1).model层封装了一层接口为什么要用接口直接的类不是更简单吗?
           答案:个人理解这就是面向接口编程,为了以后好扩展,比如获取数据的方法变了,直接新加一个实现接口的类,在activity里面换点指向的新对象就行了,符合设计模式里面的开关原则,对内修改关闭,对外扩展开放的原则,鬼知道这个玩意以后会不会,为以后扩展留好后路。
           (2).如果请求方式从okhttp换成retifit怎么办?
            答案:网络请求,最好封装一层,在model层请求数据,不要用具体的okhttp或者retifit 用自己封装统一的请求处理,方便以后的全局替换,比如以后又有崭新的框架了。
           (3).如果有多个model怎么办 会有多个listener 逻辑处理很混乱?
           答案:这就要求listener 封装的足够通用,这个model能用,其他model也能用,项目封装几个通用的listener,让足够多的model 层使用。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中的MVC设计模式是一种软件架构模式,用于将应用程序的逻辑、数据和用户界面分离开来。它由三个主要组件组成:Model(模型)、View(视图)和Controller(控制器)。 1. Model(模型):模型负责处理应用程序的数据和业务逻辑。它包含数据的获取、存储和处理方法。在Android中,模型通常是指数据源,例如数据库、网络请求或文件系统。 2. View(视图):视图负责展示数据给用户,并接收用户的输入。它通常是指Android中的布局文件,例如XML文件,用于定义应用程序的用户界面。 3. Controller(控制器):控制器负责协调模型和视图之间的交互。它接收用户的输入,并根据输入更新模型和视图。在Android中,控制器通常是指Activity或Fragment,它们处理用户的交互,并更新模型和视图。 MVC设计模式的优点是可以实现代码的重用和模块化,使得应用程序更易于维护和扩展。它将应用程序的不同部分分离开来,使得每个部分都可以独立开发和测试。 下面是一个简单的示例代码,演示了Android中的MVC设计模式: ```java // Model public class UserModel { private String name; private int age; public UserModel(String name, int age) { this.name = name; this.age = age; } // Getters and setters // Controller public class UserController { private UserModel model; private UserView view; public UserController(UserModel model, UserView view) { this.model = model; this.view = view; } public void updateName(String name) { model.setName(name); } public void updateAge(int age) { model.setAge(age); } public void displayUser() { view.displayUser(model.getName(), model.getAge()); } } // View public class UserView { public void displayUser(String name, int age) { System.out.println("Name: " + name); System.out.println("Age: " + age); } } } // Usage UserModel model = new UserModel("John", 25); UserView view = new UserView(); UserController controller = new UserController(model, view); controller.displayUser(); // 输出:Name: John, Age: 25 controller.updateName("Mike"); controller.updateAge(30); controller.displayUser(); // 输出:Name: Mike, Age: 30 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值