Android与设计模式:用单一职责原则为Activity解耦

一、什么是单一职责原则

单一职责原则(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;elsereturn btn4Str;}(int index,String str){if(index == 1)btn1Str = str;else if(index == 2)btn2Str = str;else if(index == 3)btn3Str = str;elsebtn4Str = 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 的定义吧:

人生如果错了方向,停止就是进步”。

Android与设计模式:用单一职责原则为Activity解耦

相关文章:

你感兴趣的文章:

标签云: