您的位置:首页 > 移动开发 > Android开发

Android中的“控制反转”(下)

2015-04-12 10:20 169 查看
ReportActivity要做的判断很多,如何计算不同角色报表结果的控制权在ReportActivity手上,如果角色分类多了,自然难以维护。

现在要把控制权交给InternActivity、EmployeeActivity、ManagerActivity三个,他们各自维护自己的报表计算。在ReportActivity只是接受接口的实现对象,调用接口的方法即可。



1.
定义接口,可以出报表的接口

/**
* 可报表接口 实现报表所需的方法
* 以计算工资为例 calculateWage
*/
public interface Reportable {
float calculateWage();
}


2. 在InternActivity、EmployeeActivity、ManagerActivity实现改接口的一个实现类,并传递给ReportActivity,下面以EmployeeActivity为例:
 EmployReport是一个实现类,其中 ,Parcelable是做传递参数需要,先不关注。关注Reportable接口,只需要关注的float
calculateWage()方法
即可,(其他的一大堆都是为了做Parcelable传参需要,不必理会)在这里已经把如何计算员工工资的方法设置好了,当点击报表按钮,传递的不再是一个标识,而是Reportable的实现类

/**
*员工 业务界面
*/
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);
// 不再传递标识,而是传递EmployReport的实例对象
intent.putExtra("flag", new EmployReport());
startActivity(intent);
}

/**
* 实现2个接口
* 1. 业务需要:实现Reportable 计算报表的 (关注 calculateWage方法即可)
* 2. 传递需要: 实现Parcelable接口
*/
public static final class EmployReport implements Reportable, Parcelable{
float wage = 10000.0f;

public EmployReport() { }

public EmployReport(Parcel in) {
wage = in.readFloat();
}

@Override
public float calculateWage() {
Log.d("test", "在报表处理员工的业务数据,并显示 情况. ");
Log.d("test", "工资为例 计算基本工资 * 1.0 = 实际工资");
return 0;
}

public static final Parcelable.Creator<EmployReport> CREATOR
= new Creator<EmployReport>() {
@Override
public EmployReport createFromParcel(Parcel source) {
return new EmployReport(source);
}

@Override
public EmployReport[] newArray(int size) {
return new EmployReport[size];
}
};

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeFloat(wage);
}
}
}


其他两个类似
实习生的

/**
* 实习生 业务界面
*/
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.putExtra("flag", new InternReport());
startActivity(intent);
}

public static final class InternReport implements Reportable, Parcelable{

public InternReport() { }

public InternReport(Parcel in) {}

@Override
public float calculateWage() {
Log.d("
4000
test", "在报表处理实习生的业务数据,并显示 情况.");
Log.d("test", "工资为例: 计算基本工资 * 0.6 = 实际工资");
return 0;
}

public static final Parcelable.Creator<InternReport> CREATOR
= new Creator<InternReport>() {
@Override
public InternReport[] newArray(int size) {
return new InternReport[size];
}

@Override
public InternReport createFromParcel(Parcel source) {
return new InternReport(source);
}
};

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {

}

}

}


经理的

/**
* 经理 业务界面
*/
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.putExtra("flag", new ManagerReport());
startActivity(intent);
}

public static final class ManagerReport implements Reportable, Parcelable{
public ManagerReport() { }

public ManagerReport(Parcel in) { }

@Override
public float calculateWage() {
Log.d("test", "在报表处经理的业务数据 并显示 情况. 计算基本工资 * 1.0 + 绩效工资 = 实际工资");
Log.d("test", "工资为例 计算基本工资 * 1.0 + 绩效工资 = 实际工资");
return 0;
}

public static final Creator<ManagerReport> CREATOR
= new Creator<ManagerReport>() {
@Override
public ManagerReport[] newArray(int size) {
return new ManagerReport[size];
}

@Override
public ManagerReport createFromParcel(Parcel source) {
return new ManagerReport(source);
}
};

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {

}
}
}


3. 在ReportActivity中只做接收,接收的对象是个Reportable接口类型的实现,根据Java的多态特性,变得非常简单了,计算工资,只需要调用接口的方法,calculateWage()就可以了。

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

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_report);

// 这里只是接受对象, 处理报表即可
Reportable report = getIntent().getParcelableExtra("flag");
report.calculateWage();
}
}

这样一来,在ReportActivity只管处理数据结果的显示,控制计算结果的算法在角色Activity各自实现类中完成。

参考Demo 源代码 http://download.csdn.net/detail/w315251124/8586323
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息