对于安卓设计模式的理解,我感觉还不透彻,但是本着要总结一下,进步自己的信心,决定要一系列的把这些总结一下,可能很多人都说mvc这种都过时,为什么还要总结,现在那么流行的mvp不多写写,其实mvc用处还是蛮大的,先总结一下吧,
mvc顾名思义model view controller即模型,视图,控制器。一种典型的三层接口设计模式,下面直接引用百度百科的图片,
根据上图可以很清晰的看出啊,这是一个四层交互,可能有人问,还有一层在哪,那就是这个用户啊,这四个完美的连接成一个逻辑循环,
这是一个MVC的demo,是利用智能机器人做的一个基于MVC的设计模式
效果如图:
下面直接看代码里面的应用:
c:即controller,为控制器,主要是实现读取用户输入的内容,然后控制model进行数据交互。
代码在activity中,为
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.edit_seach);
recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
}
@Override
public void onClick(View view) {
if (view.getId() == R.id.btn_seachach){
String title = editText.getText().toString();
searchModel(title);
mDatas.add("" + title);
}
}
m:即为model,接收到从controller中传递过来的用户反馈,然后去处理数据并且将这些数据返回给view层。
private void searchModel(final String title){
new Thread(new Runnable() {
@Override
public void run() {
try {
String url = "http://apis.haoservice.com/efficient/robot";
OkHttpClient okHttpClient = new OkHttpClient();
String json = "{'key':'b430813960cd4a77be704a9e4e237246','info':'" + title +"','format':'json'}";
RequestBody formBody = new FormBody.Builder().add("key", "b430813960cd4a77be704a9e4e237246")
.add("info", "" + title)
.add("format", "json")
.build();
Request request = new Request.Builder().url(url).post(formBody).build();
okhttp3.Response response = okHttpClient.newCall(request).execute();
Log.i("ssssssssssssssssss","sssss");
String str = response.body().string();
Log.i("ssssssssssssssssss","-------"+str);
Gson gson = new Gson();
News news = gson.fromJson(str,News.class);
mDatas.add(news.result.text);
Message message = Message.obtain();
message .arg1 = 1;
MainActivity.this.myHandler.sendMessage(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
v:vie层,该层通过Handler来返回处理返回的数据,适配到recyclerview中去
Handler myHandler = new Handler() {
public void handleMessage(Message msg) {
updataUI();
}
};
private void updataUI(){
mAdapter = new HomeAdapter();
recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
recyclerView.setAdapter(mAdapter);
}
class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder>
{
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
MyViewHolder holder = new MyViewHolder(LayoutInflater.from(
MainActivity.this).inflate(R.layout.item_home, parent,
false));
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position)
{
holder.tv.setText(mDatas.get(position));
}
@Override
public int getItemCount()
{
return mDatas != null ? mDatas.size() : 0;
}
class MyViewHolder extends RecyclerView.ViewHolder
{
TextView tv;
public MyViewHolder(View view)
{
super(view);
tv = (TextView) view.findViewById(R.id.tvName);
}
}
}
布局的XML文件
也是属于view层的;
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.mytestmvc.MainActivity">
<LinearLayout
android:id="@+id/search"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_seachach"
android:onClick="onClick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送"/>
<EditText
android:id="@+id/edit_seach"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_below="@+id/search"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</android.support.v7.widget.RecyclerView>
</RelativeLayout>
item_home.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_margin="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tvName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#bbb"
android:gravity="center"
android:text="A"/>
</LinearLayout>
该demo是典型的mvc模式构建的项目方法
使用mvc构建项目的好处还是比比较明显的
1.耦合度,使用MVC可以做的大程度的解耦,,代码耦合度低是很好的,方便开发,更改,项目清晰
2.复用,复用是编写代码里很重要的一节,MVC能做到大幅度的复用,快速开发,后期修改都是很简单的
其实现阶段来说,对于开发Android,mvc是比较好理解的,很清晰的项目结构,适合新手开发者,但是对于项目来说,还是有很大的缺点的,
现在开发的后台大多使用mvc模式来开发,但是mvc对于android端,我是不推荐的,因为他逻辑不够清晰,对代码来说还是比较笨重,但是从另外一个方面来说,包括另外几种框架,mvp,mvvm,都可以看成是mvc模式的变种,我个人是这样觉得的,这样来开是从mvc升级过来了,还是先理解mvc的模式,才能更快速的利用其他的设计模式。