一、什么是单一职责原则单一职责原则(SRP:Single responsibility principle)又称单一功能原则,其定义为:一个类,应该只有一个可以导致变化的原因。光看概念
一、什么是单一职责原则
单一职责原则(SRP:Single responsibility principle)又称单一功能原则,其定义为:一个类,应该只有一个可以导致变化的原因。光看概念会让人很头疼,我先讲点小例子吧:
二、单一职责原则能解决什么问题
回顾我们的 Android 开发经历,很多人都会发现 Activity 类中的代码总会不知不觉地变得很多,这会让读我们代码的人非常痛苦。而造成这种情况的其中一个原因是:Activity 中需要与用户进行大量的交互,用户的操作会改变 Activity 当前显示的界面元素/对应的信息,所以我们总会把 Model、View、点击事件等等……操作全都放到了 Activiy 中,但这样存在一个很严重的问题,无脑地为 Activity 添加代码,势必让 Activity 变得臃肿,结构混乱,职责模糊,特别是之前负责该项目的工程师已经离职,新入职的工程师需要重构该 Activity 时,必将痛不欲生。
那么我们要怎样为 Activity 解耦呢?我先通过一个小 Demo 以单一职责原则的思想为 Activity 解耦,详情如下:
{
private String btn1Str = "btn1 Clicked 1";
private String btn2Str = "btn2 Clicked 1";
private String btn3Str = "btn3 Clicked 1";
private String btn4Str = "btn4 Clicked 1";
public String getData(int index){
if(index == 1)
return btn1Str;
else if(index == 2)
return btn2Str;
else if(index == 3)
return btn3Str;
else
return btn4Str;
}
(int index,String str){
if(index == 1)
btn1Str = str;
else if(index == 2)
btn2Str = str;
else if(index == 3)
btn3Str = str;
else
btn4Str = str;
}
}
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
{
private Button btn1;
private Button btn2;
private Button btn3;
private Button btn4;
private Data data = new Data();
(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = (Button)findViewById(R.id.button1);
btn2 = (Button)findViewById(R.id.button2);
btn3 = (Button)findViewById(R.id.button3);
btn4 = (Button)findViewById(R.id.button4);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
btn4.setOnClickListener(this);
}
(){
//各种网络请求操作更新数据
}
(View v) {
switch(v.getId()){
case R.id.button1:
btn1.setText(data.getData(1));
break;
case R.id.button2:
btn2.setText(data.getData(2));
break;
case R.id.button3:
btn3.setText(data.getData(3));
break;
case R.id.button4:
btn4.setText(data.getData(4));
break;
}
}
}
在 Demo 里我们可以看到,所有相关的操作都在 Activity 里进行,要知道,这还只是一个非常简单的页面,可以说完全不存在业务逻辑。换成一个业务逻辑复杂的页面,这还用玩?接下来换一个思路,用 MVP 模式解耦:
{
private Data data;
private IView iView;
public Presenter(IView iView) {
this.iView = iView;
data = new Data();
}
public Data getData(){
return data;
}
(int index,String str){
//各种网络请求更新数据
data.setData(index, str);
updateView();
}
(){
iView.updateView(data);
}
}
{
(Data data);
}
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
,OnClickListener{
private Button btn1;
private Button btn2;
private Button btn3;
private Button btn4;
private Presenter presenter;
private Data data = new Data();
(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = (Button)findViewById(R.id.button1);
btn2 = (Button)findViewById(R.id.button2);
btn3 = (Button)findViewById(R.id.button3);
btn4 = (Button)findViewById(R.id.button4);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
btn4.setOnClickListener(this);
presenter = new Presenter(this);
}
(Data data) {
this.data = data;
}
(View v) {
switch(v.getId()){
case R.id.button1:
btn1.setText(data.getData(1));
break;
case R.id.button2:
btn2.setText(data.getData(2));
break;
case R.id.button3:
btn3.setText(data.getData(3));
break;
case R.id.button4:
btn4.setText(data.getData(4));
break;
}
}
}
进行这样的重构之后,Activity 类发生了什么变化呢?我们先回想下 Android SDK 对 Activity 的定义吧: