Android中的"控制反转"(上)

一个功能需求提出来,有时会把这个功能封装成为一个模块。假如有多个地方需要调用这个模块的话,那么不同调用者处理该功能的方法可能不一样。

最简单的例子,大学毕业设计做的一个 “公司人员管理” 的系统。

简单起见,将人员角色分3类:实习生、员工、经理,并各自有一个Activity管理他们:

InternActivity

EmployeeActivity

ManagerActivity


假设目前阶段已经做好对这三个角色的基本操作——增删改查。 现在客户要求有”人员统计“的需求。我们会将统计设计成一个独立的模块, 来负责统计数据显示的ReportActivity中,我们要去判断不同角色的不同情况,做出相应的判断.


一般的做法是这样的:

实习生、员工、经理的Activity中,通过Intent启动ReportActivity,然后传入一个标识”flag“进去,

ReportActivity分别对带来的flag判断,是 实习生、员工、经理 中的哪一类,用if else 语句或者switch语句,对传入不同的角色进行不同的统计。

这样一来,ReportActivity要做的判断就很多,ReportActivity和三个角色的耦合度就比较高了。假如有一个新的角色“试用期的员工”要管理,那么需要去修改ReportActivity,再来一个if 判断flag是否是试用期员工,这样不够独立。


具体代码示例:


1. 实习生的Activity,上面就一个【查看实习生报表】mReportBtn按钮作为演示,表示要进入报表的Activity,并设置带入一个flag=1

/**
 * 实习生 业务界面
 */
public class InternActivity extends Activity implements OnClickListener{
	
	Button mReportBtn = null;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_intern);
		
		mReportBtn = (Button) findViewById(R.id.intern_reportBtn);
		mReportBtn.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		Intent intent = new Intent(this, ReportActivity.class);
		intent.setFlags(1);		// 假设标识1是实习生
		startActivity(intent);
	} 
}


2. 员工的Activity,同上,就一个【查看员工报表】mReportBtn按钮作为演示,表示要进入报表的Activity 并设置带入一个flag=2

/**
 *员工 业务界面
 */
public class EmployeeActivity extends Activity implements OnClickListener{
	Button mReportBtn = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_employee);
		
		mReportBtn = (Button) findViewById(R.id.employee_reportBtn);
		mReportBtn.setOnClickListener(this);
	}
	
	@Override
	public void onClick(View v) {
		Intent intent = new Intent(this, ReportActivity.class);
		intent.setFlags(2);		// 假设标识2是 员工
		startActivity(intent);
	} 
 

}


2. 员工的Activity,同上,就一个【查看员工报表】mReportBtn按钮作为演示,表示要进入报表的Activity,并设置带入一个flag=3

/**
 * 经理 业务界面
 */
public class ManagerActivity extends Activity implements OnClickListener{
	Button mReportBtn = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_manager);
		
		mReportBtn = (Button) findViewById(R.id.manager_reportBtn);
		mReportBtn.setOnClickListener(this);
	} 
	
	@Override
	public void onClick(View v) {
		Intent intent = new Intent(this, ReportActivity.class);
		intent.setFlags(3);			// 假设标识3是经理
		startActivity(intent);
	}

}




4. 最后是ReportActivity,这里要处理三者的不同情况,在这里打印几句话示意即可。

/**
 * 报表
 */
public class ReportActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_report);
		
		int flag = getIntent().getFlags();
		Log.d("test", "flag = " + flag);
		
		// 这里需要根据不同的业务,做各种的处理
		switch (flag) {
		case 1:
			Log.d("test", "在报表处理实习生的业务数据,并显示 情况.");
			Log.d("test", "工资为例: 计算基本工资  * 0.6 = 实际工资");
			break;
			
		case 2:
			Log.d("test", "在报表处理员工的业务数据,并显示 情况. ");
			Log.d("test", "工资为例 计算基本工资  * 1.0 = 实际工资");
			break;
			
		case 3:
			Log.d("test", "在报表处经理的业务数据 并显示 情况. 计算基本工资  * 1.0 + 绩效工资 = 实际工资");
			Log.d("test", "工资为例 计算基本工资  * 1.0 + 绩效工资 = 实际工资");
			break;

		default:
			break;
		}
	}
}


Demo源码:  http://download.csdn.net/detail/w315251124/8586193



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值