Android项目结构之模块内结构优化

来源:互联网 发布:photoshop6 mac 编辑:程序博客网 时间:2024/06/05 21:02

Android的模块内部结构优化

这种优化在于着重对代码的优化,不是性能上的优化,一个好的代码结构可以让你在以后的开发上省去很多时间,而且方便以后对代码的修改,特别是在多人开发的时候,可以有效的进行分工,提高开发效率。

一.基于MOVE模型的代码结构优化

这种优化是基于MOVE模型和中介者模式来进行的,Activity在这里只是起到了一个中介者的作用,把其他的事件和业务逻辑拆分出去,而整个模块中他们是一个横向的结构,而不是传统的纵向结构,数据都是通过event进行分发,先传递到Activity然后通过Activity再分发给相应的业务,所以是业务来驱动数据。而M为Model,O为operation,E为Event,V为View,其中这里的view,event,operation是不能相互见面的,它们之间的交互都是通过Activity来进行转发的。

#move模型图

这里写图片描述

二.MOVE之模型层(Models)

创建一个原型模型即一个“user”对象。它至少有一个用户名(email),或许还有一个名字(name)和电话号码(number)。

在一个MOVE模型应用程序中,模型层(Models)只用于包装知识。意思是,它包含让你验证“这是否是用户密码?”的函数来让获取(getters)和设置(setters)属性值。但是它不包含让你保存它们到数据库或者上传到一个外部API的函数。这是操作层(Operations)的事情。

三.MOVE之操作层(Operations)

一个基本的操作例子就是让用户登录。这分两个字操作来完整。第一,获取用户的用户名(email)和密码(password)。第二,加载调用从数据库查询出数据而设置好的的“user”模型,验证密码是否正确。

操作层(Operations)是MOVE模型世界的执行者。它的职责是设置的模型层(Models),在正确的时间调用显示正确的视图层(Views)以及相应用户触发引起的事件层(Events)。在一个好的应用程序中,每一个子操作都可以在父操作下独立运行。这也是为什么图表中事件层中流往上走和改变往下走。

用操作层(Operations)这种方式让人惊讶之处在于,当程序重启开始的时候,你的整个应用程序可以视为是一个操作(Operation)。根据需要被分为多个子操作。同时,每一个字操作可以并行存在运行。另外,当所有字操作运行完成时,程序退出。

四.MOVE之视图层

登录界面是一个显示若干文本框给用户的一个视图(View)。当用户点击“Login”按钮,视图(View)会产生一个包含用户输入用户名和密码的“loginAttempt”的事件(event)。

用户能看到和能交互的所有事情应该被建设为一个视图(view)。它们不但不显示应用程序在不明方式下的状态,而且将用户产生的交互简化为有意义的事件(Events)。重要的是,视图(views)不会直接改变模型(models),它们简单地触发事件到操作,然后等待由模型触发事件所引起的改变。

五.MOVE之事件层

事件“loginAttempt”是由于用户点击登录的视图触发的。另外,当登录操作完成,“currentUser”模型会触发事件,将模型引起的改变通知应用程序。监听事件是让MOVE模式(和MVC模式)的一种逆控制。这种控制是在模型没有直接意识到视图在更新的时候,你允许模型更新视图。这是一种高度抽象的技术。这种技术允许组件相互存在而又相互不影响。

六.代码范例

能用代码解决的问题咱们还是都用代码来解决吧,代码只是伪代码,为了表示代码结构。

1.view部分,新建一个Presenter,所有的view的定义界面初始化都在这里。

/***/public class BaseActivityPresenter {    private static final int ErrorActivityResId = -1;    protected int mLayoutResID;    protected WeakReference<Activity> mWeakActivity;    protected BaseEventInterface mBaseEventInterface;    public  YKBaseActivityPresenter(){        mLayoutResID = -1;    }    public int layoutResID(){        return ErrorActivityResId;    }    public void setActivityPresenter(Activity activity){        if (null == activity && layoutResID() == ErrorActivityResId ){            return;        }        activity.setContentView(layoutResID());        mWeakActivity = new WeakReference<Activity>(activity);        initView();    }    public void setBaseEventInterface(BaseEventInterface baseActivityEventInterface) {        mBaseEventInterface = baseActivityEventInterface;    }    protected void initView(){    }}/**Presenter伪代码*/public class Presenter extends BaseActivityPresenter {    private WeakReference<Activity> mWeakActivity;    @Override    public int layoutResID() {        return R.layout.mainactivity;    }    @Override    public void setActivityPresenter(Activity activity) {        mWeakActivity = new WeakReference<Activity>(activity);        activity.setContentView(layoutResID());        initView();    }    @Override    public void setBaseEventInterface(YKBaseEventInterface baseActivityEventInterface) {        mBaseEventInterface =  baseActivityEventInterface;    }    @Override    protected void initView() {        Activity activity = mWeakActivity.get();        if(null == activity){            return;        }        /**      详细方法在event里回调,这里只实现view的展示      */      private void setListener(){          btn.setOnClickListener(new OnClickLisener{              mBaseEventInterface.xxxxx();          }          );      }

2.event部分,新建一个event,这是事件的分发类

public interface EventInterface {    public  void   handleBaseEvent(final int eventType, Object contextObject);}/**详细event实现*/public class Event implements YKBaseEventInterface {    private WeakReference<Activity> mWeakActivity;    private NetCallBack mNetCallBack;    public YKLoginEvent(Activity activity){        mWeakActivity = new WeakReference<Activity>(activity);    }    public void setCallBack(NetCallBack netCallBack){            this.mNetCallBack = netCallBack;    }    @Override    public void handleBaseEvent(int eventType, Object contextObject) {        switch (eventType){            case 0:            /**详细实现*/                break;            case 1:              /**详细实现*/                break;        }    }}

3.manager部分,所有的有关业务的操作都在这里面

public class Manager {private User mUser;    private WeakReference<Activity> mWeakActivity;    public Manager(Activity activity){        mWeakActivity = new WeakReference<>(activity);    }            /***业务类,主要业务在这里实现*/            /**数据处理,获取到数据后,在这里再回调回presenter,对数据进行展示。*/    }

4.model部分,数据类

public class YKUser implements Parcelable{    public YKUser(){    }    private String mUserId = "";    private String mPhoneNumber = "";    ....    ....    }

5.Activity或Fragment等,他们只是一个中介的作用,所有的这几个部分都从这里进行交互

public class Activity implements BaseEventInterface {    private Presenter mPresenter;    private Event mEvent;    private Manager mManager;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        mPresenter = new Presenter();        mManager = new Manager(this);        mManager.setxxxxx(this);        mEvent = new Event(this);        mEvent.setxxxxx(this);        mPresenter.setBaseEventInterface(this);        mPresenter.setActivityPresenter(this);    }    }

MOVE模型为一种横向的代码结构管理模型,各个部分之间的方法的调用可以用回调来实现,然后在Acitivity中进行注册,以Activity为中介,以此来实现各个部分的分离,减少耦合性,但是move模型并不一定试用所有的项目情况,要根据具体需求具体对待,MVP,MVVM都是不错的代码结构模型,但是要根据具体的项目来确定哪种结构是适合自己项目的。以后再总结其他的代码结构管理模型,灵活运用,带到结构优化的目的!

2 0
原创粉丝点击