Android设计模式:MVC框架模式

  1. MVC:Model-View-Controller(模型-视图-控制器)。
  2. 1978年被提出,至今已演化出许多版本。
  3. 事实上,MVC是一种框架模式而非设计模式。
  4. GOF把MVC看成是3种设计模式:观察者、策略与组合等模式的合体,且核心在观察者模式。
  5. 理解:
    • 视图:由GUI组件构成,响应用户交互行为并触发Controller。(如XML布局)
    • 控制器:根据View的事件逻辑修改对应的Model。(如Activity)
    • 模型:保持程序的数据状态,通过事件机制让视图更新。(如数据操作类)
  6. 体现:ListView(View)、Adapter(Controller)、获取ListView展示数据的相关实现类(Model)。
  7. 示例图:在XML中进行界面的设计,在Activity中进行页面的初始化并设置按钮的监听事件,在Model中对数据进行修改并进行UI的更新。MVC框架模式的代码的个人理解思路
  8. 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>
  1. 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;
    }
}
  1. 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源码设计模式解析与实战》进行个人的理解

猜你喜欢

转载自blog.csdn.net/weixin_37378399/article/details/86369914