- MVC:Model-View-Controller(模型-视图-控制器)。
- 1978年被提出,至今已演化出许多版本。
- 事实上,MVC是一种框架模式而非设计模式。
- GOF把MVC看成是3种设计模式:观察者、策略与组合等模式的合体,且核心在观察者模式。
- 理解:
- 视图:由GUI组件构成,响应用户交互行为并触发Controller。(如XML布局)
- 控制器:根据View的事件逻辑修改对应的Model。(如Activity)
- 模型:保持程序的数据状态,通过事件机制让视图更新。(如数据操作类)
- 体现:ListView(View)、Adapter(Controller)、获取ListView展示数据的相关实现类(Model)。
- 示例图:在XML中进行界面的设计,在Activity中进行页面的初始化并设置按钮的监听事件,在Model中对数据进行修改并进行UI的更新。
- mvc_view.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal"
>
<ImageView
android:id="@+id/main_image_iv"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<Button
android:id="@+id/main_load_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="@string/load"/>
<Button
android:id="@+id/main_clear_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="@string/clear"
/>
</LinearLayout>
</LinearLayout>
- Model.java
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import com.example.designpatterns.R;
import android.os.Handler;
public class Model {
private final Handler mHandler = new Handler();
private OnStateChangeListener mListener; // Model状态改变监听器
private Bitmap mBitmap;
private Context mContext;
public interface OnStateChangeListener{
void onStateChanged(Bitmap image);
}
public Model(Context context){
mContext = context;
// 初始化时预加载一个图片作为默认图
mBitmap = BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher);
}
public void setOnStateChangeListener(OnStateChangeListener listener){
mListener = listener;
}
public void loadImage(){
new Thread(new Runnable() {
@Override
public void run() {
try {
// 模拟耗时操作
Thread.sleep(3000);
// 获取图像
mBitmap = BitmapFactory.decodeResource(
mContext.getResources(), R.mipmap.ic_launcher);
// 回传给View
if (null != mListener) {
mHandler.post(new Runnable(){
@Override
public void run(){
mListener.onStateChanged(mBitmap);
}
});
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
public void clear(){
// 清除图像
mBitmap = null;
// 回传给View
if (null != mListener) {
mHandler.post(new Runnable() {
@Override
public void run() {
mListener.onStateChanged(null);
}
});
}
}
public Bitmap getImage(){
return mBitmap;
}
}
- MainActivity.java
import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import com.example.designpatterns.mvc.Model;
public class MainActivity extends AppCompatActivity implements Model.OnStateChangeListener {
private ImageView mIVImage;
private Model mModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mvc_view);
mModel = new Model(this);
mModel.setOnStateChangeListener(this);
mIVImage = (ImageView) findViewById(R.id.main_image_iv);
mIVImage.setImageBitmap(mModel.getImage());
}
public void onClick(View view){
switch (view.getId()) {
case R.id.main_load_btn:
mModel.loadImage();
break;
case R.id.main_clear_btn:
mModel.clear();
break;
}
}
@Override
public void onStateChanged(Bitmap image){
mIVImage.setImageBitmap(image);
}
}
PS:基于《Android源码设计模式解析与实战》进行个人的理解