android activity解耦,Android与设计模式:用单一职责原则为Activity解耦
一、什么是單一職責(zé)原則單一職責(zé)原則(SRP:Single responsibility principle)又稱單一功能原則,其定義為:一個類,應(yīng)該只有一個可以導(dǎo)致變化的原因。光看概念
一、什么是單一職責(zé)原則
單一職責(zé)原則(SRP:Single responsibility principle)又稱單一功能原則,其定義為:一個類,應(yīng)該只有一個可以導(dǎo)致變化的原因。光看概念會讓人很頭疼,我先講點(diǎn)小例子吧:
二、單一職責(zé)原則能解決什么問題
回顧我們的 Android 開發(fā)經(jīng)歷,很多人都會發(fā)現(xiàn) Activity 類中的代碼總會不知不覺地變得很多,這會讓讀我們代碼的人非常痛苦。而造成這種情況的其中一個原因是:Activity 中需要與用戶進(jìn)行大量的交互,用戶的操作會改變 Activity 當(dāng)前顯示的界面元素/對應(yīng)的信息,所以我們總會把 Model、View、點(diǎn)擊事件等等……操作全都放到了 Activiy 中,但這樣存在一個很嚴(yán)重的問題,無腦地為 Activity 添加代碼,勢必讓 Activity 變得臃腫,結(jié)構(gòu)混亂,職責(zé)模糊,特別是之前負(fù)責(zé)該項目的工程師已經(jīng)離職,新入職的工程師需要重構(gòu)該 Activity 時,必將痛不欲生。
那么我們要怎樣為 Activity 解耦呢?我先通過一個小 Demo 以單一職責(zé)原則的思想為 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);
}
(){
//各種網(wǎng)絡(luò)請求操作更新數(shù)據(jù)
}
(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 里我們可以看到,所有相關(guān)的操作都在 Activity 里進(jìn)行,要知道,這還只是一個非常簡單的頁面,可以說完全不存在業(yè)務(wù)邏輯。換成一個業(yè)務(wù)邏輯復(fù)雜的頁面,這還用玩?接下來換一個思路,用 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){
//各種網(wǎng)絡(luò)請求更新數(shù)據(jù)
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;
}
}
}
進(jìn)行這樣的重構(gòu)之后,Activity 類發(fā)生了什么變化呢?我們先回想下 Android SDK 對 Activity 的定義吧:
總結(jié)
以上是生活随笔為你收集整理的android activity解耦,Android与设计模式:用单一职责原则为Activity解耦的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 媒体实测电动车-20°C低温续航 40款
- 下一篇: 流量节省模式 Android,这三种方法