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

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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值