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();
}
}