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

ReportActivity要做的判断很多,如何计算不同角色报表结果的控制权在ReportActivity手上,如果角色分类多了,自然难以维护。

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


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

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



2. 在 InternActivityEmployeeActivity、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("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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值