Android面试之MVP(自己的理解)

Android面试之MVP(有关于封装请点我

最近刚刚把封装的mvp给删掉了(因为我觉得自己用的根本不是mvp)

总所周知,MVP分为 M V P 三层,P层是 M V 两层的桥梁,分别与两层进行着双向通信, M V 两层是没有直接联系的。

我的做法貌似就抛弃了 M 层,所谓的 M 层竟然和 V 层直接双向通信了。我发觉封装的不对,于是就决然把以前的删掉了,重新写一个真正的MVP

1.什么是mvp(这里直接套用一张网上的图片,感谢万能的博客)

在这里插入图片描述

实际上MVP就是通过继承与接口实现代码逻辑的分离(应该说MVP是这种方式的一个较好的案例)。

2.MVP的作用

代码解耦并且增加了代码的可读性(貌似我接触的框架都是这两个作用),这里就先不说可维护性和扩展性,因为在项目需求上体现不出来(可能是我没达到那个境界)。

至于他的缺点也很明显,增加了好多的代码量,某些情况下不好维护,可扩展性也很弱。

3.MVP的使用

除去一些基本的东西,关于封装我们需要重视两个东西

1)体现出Model层
2)减少类的创建
1.我创建了最基本的类

在这里插入图片描述
3个接口和一个测试Activity,我要做的就是点击按钮的时候打印log,然后返回打印的字符串,用Toast显示出来。(log必须要M才能知到到要打印的东西)

public interface IM {

    String log();

}
public interface IV {

    void log();

    void toastString(String text);

}
public interface IP extends IV{

}
以下是Activity里面的调用
public class TestActivity extends AppCompatActivity implements IV {

    private IP presenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        findViewById(R.id.btnClickToLog).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                log();
            }
        });
    }

    @Override
    public void log() {
        presenter.log();
    }

    @Override
    public void toastString(String text) {
        Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
    }

}
问题来了,presenter并没有初始化,我们需要创建一个类(Presenter)来使他初始化。
public class Presenter implements IP {

    IM mModel = null;
    IV mView = null;

    public Presenter(IV mView) {
        this.mView = mView;
    }

    @Override
    public void log() {
        String logString = mModel.log();
        mView.toastString(logString);
    }

    @Override
    public void toastString(String text) {
        //没用 我们先不管它
    }
}
这里我们发现mModel并没有初始化,我们需要创建一个类(Model)来使他初始化。
public class Model implements IM {
    @Override
    public String log() {
        String logString = "hello word";
        Log.e("Model", logString);
        return logString;
    }
}
有关于Presenter的初始化,我们在TestActivity里面执行
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        //初始化P
        presenter = new Presenter(this);//this指的其实是IV
        
        findViewById(R.id.btnClickToLog).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                log();
            }
        });
    }
有关于Model的初始化我们在Presenter里面执行
    public Presenter(IV mView) {
        //赋值IV
        this.mView = mView;
        //初始化IM
        mModel = new Model();
    }

接下来就是见证奇迹的时刻,打开模拟器运行项目

在这里插入图片描述
在这里插入图片描述

如此如此这般这般,最后的代码如下

在这里插入图片描述

public interface IM {

    String log();

}

public interface IV {

    void log();

    void toastString(String text);

}

public interface IP extends IV{

}

public class Model implements IM {
    @Override
    public String log() {
        String logString = "hello word";
        Log.e("Model", logString);
        return logString;
    }
}

public class Presenter implements IP {

    IM mModel = null;
    IV mView = null;

    public Presenter(IV mView) {
        //赋值IV
        this.mView = mView;
        //初始化IM
        mModel = new Model();
    }

    @Override
    public void log() {
        String logString = mModel.log();
        mView.toastString(logString);
    }

    @Override
    public void toastString(String text) {
        //没用 我们先不管它
    }
}

public class TestActivity extends AppCompatActivity implements IV {

    private IP presenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        //初始化P
        presenter = new Presenter(this);//this指的其实是IV

        findViewById(R.id.btnClickToLog).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                log();
            }
        });
    }

    @Override
    public void log() {
        presenter.log();
    }

    @Override
    public void toastString(String text) {
        Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
    }

}

本来是打算封装一下的,不过内容好像很多的样子,下次吧。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值