多对象封装处理表格数据,组合模式读存取数据
这时可以考虑将许多数据封装为一个对象,即对象打包,再做数据批量处理
1.应用场景:
--------------------------------------------------------------------------
填入数据后:
--------------------------------------------------------------------------
转入,转出空格为EditText,日期为TextView控件
2.数据封装类
转入,转出,日期控件可以封装成一个类,放入集合中,便于取出操作:
封装的包装类: ProtocolCash.java
package com.xiebao.protocol.bean;
import android.widget.EditText;
import android.widget.TextView;
public class ProtocolCash {
/**
* 协议方
*/
private String partner;
private TextView dateText;
/**
* 转入
*/
private EditText inflowEdit;
/**
* 转出
*/
private EditText outflowEdit;
public ProtocolCash(String partner, EditText inflowEdit,
EditText outflowEdit) {
super();
this.partner = partner;
this.inflowEdit = inflowEdit;
this.outflowEdit = outflowEdit;
}
public ProtocolCash(String partner, EditText outflowEdit, TextView dateText) {
super();
this.partner = partner;
this.outflowEdit = outflowEdit;
this.dateText = dateText;
}
public TextView getDateText() {
return dateText;
}
public void setDateText(TextView dateText) {
this.dateText = dateText;
}
public String getPartner() {
return partner;
}
public void setPartner(String partner) {
this.partner = partner;
}
public EditText getInflowEdit() {
return inflowEdit;
}
public void setInflowEdit(EditText inflowEdit) {
this.inflowEdit = inflowEdit;
}
public EditText getOutflowEdit() {
return outflowEdit;
}
public void setOutflowEdit(EditText outflowEdit) {
this.outflowEdit = outflowEdit;
}
}
3.将对象加入列表中:
在情景MainActivity类中我们这样使用:
定义集合:
// 表格中的数据,用一个对象ProtocolCash来承载
ArrayList<ProtocolCash> cashDataList = new ArrayList<ProtocolCash>();
/**
* 表格列表
*
* @param agreeParty
*/
private void showCahLayout(String fang, String agreeParty) {
View cashView = View
.inflate(context, R.layout.single_cash_twomodify_layout, null);
TextView nameText = (TextView) cashView
.findViewById(R.id.fang_name_text);
EditText outEdit = (EditText) cashView
.findViewById(R.id.outflow_edittext);
TextView dateText = (TextView) cashView
.findViewById(R.id.date_edittext);
nameText.setText(fang);
setDate(dateText);
cashDataList.add(new ProtocolCash(agreeParty,outEdit,dateText));//将封装的对象加入列表
cashListLayout.addView(cashView);
}
4.判断数据
//当choiceType为实时转移时,转入转出相等
if(TextUtils.equals(choiceType, TIME_TRANSFER)){
double sumIn = 0.00d;
double sumOut=0.00d;
for (ProtocolCash cash : cashDataList) {
String inflow = cash.getInflowEdit().getText().toString().trim();//读取填入的数据
if(!TextUtils.isEmpty(inflow)){
sumIn+=Double.valueOf(inflow) ;
}
String outflow = cash.getOutflowEdit().getText().toString().trim();//读取填入的数据
if(!TextUtils.isEmpty(outflow)){
sumOut+=Double.valueOf(outflow) ;
}
}
if(sumIn!=sumOut){
ToastUtils.show(context, "转入转出不相等");
return null;
}
}
这样已经实现了。停下来想想,貌似 有不妥的地方
-----------------------------------------------------------------------------------------------------------------
5.思考
依据迪米特法则,一个对象应该对其他对象有最少的了解,你的内部是如何复杂和我没关系;比喻:个人隐私尽可能的少暴露,别人知道的越少越好
自己的逻辑自己处理,尽量不要对外公布太多的public方法,减少类间的耦合,提高类的复用率,
不需要暴露的属性和方法尽量不要暴露,
观察上面的ProtocolCash.java类,其对象的添加,获取都暴露在主类MainActivity中,是否可以不暴露,对外提供添加,获取的方法来实现,比喻:我的故事你知道的越少越好,这样我的故事改变了,可以对你没影响,便于扩展增加程序的健壮性
6.重写封装类
package com.xiebao.protocol.bean;
import java.util.ArrayList;
import android.text.TextUtils;
import android.widget.EditText;
import android.widget.TextView;
public class ProtocolCash {
/**
* 协议方
*/
private String partner;
private TextView dateText;
/**
* 转入
*/
private EditText inflowEdit;
/**
* 转出
*/
private EditText outflowEdit;
ArrayList<ProtocolCash> cashDataList = new ArrayList<ProtocolCash>();// 新增加
// 声明列表
public ProtocolCash(String partner, EditText inflowEdit,
EditText outflowEdit) {
super();
this.partner = partner;
this.inflowEdit = inflowEdit;
this.outflowEdit = outflowEdit;
}
public ProtocolCash(String partner, EditText outflowEdit, TextView dateText) {
super();
this.partner = partner;
this.outflowEdit = outflowEdit;
this.dateText = dateText;
}
/**
* 获取集合对象
*
* @return
*/
public ArrayList<ProtocolCash> getCashDataList() {
return cashDataList;
}
public void setCashDataList(ArrayList<ProtocolCash> cashDataList) {
this.cashDataList = cashDataList;
}
/**
* 添加数据
*
* @param agreeParty
* @param outEdit
* @param dateText
*/
public void addCash(String agreeParty, EditText outEdit, TextView dateText) {
cashDataList.add(new ProtocolCash(agreeParty, outEdit, dateText));// 将封装的对象加入列表
}
/**
* 转入转出是否相等
*
* @return false不相等, true相等
*/
public boolean getIsEquality() {
double sumIn = 0.00d;
double sumOut = 0.00d;
for (ProtocolCash cash : cashDataList) {
String inflow = cash.getInflowEdit().getText().toString().trim();// 读取填入的数据
if (!TextUtils.isEmpty(inflow)) {
sumIn += Double.valueOf(inflow);
}
String outflow = cash.getOutflowEdit().getText().toString().trim();// 读取填入的数据
if (!TextUtils.isEmpty(outflow)) {
sumOut += Double.valueOf(outflow);
}
}
if (sumIn != sumOut) {
return false;
} else {
return true;
}
}
//getters and setters ......
}
这样的对象的集合 的操作封装就是 组合模式,当然这里只有简单的一层树,把对对象集合的操作 封装成对象来操作
当然也可以新建一个第三方类来封装
可以参考:
Java设计模式透析之 —— 组合(Composite) - 郭霖的专栏
点击打开链接
点击打开链接
7.情景类调用
在MainActivity调用是这样滴:
声明对象
ProtocolCash cash=new ProtocolCash();
集合中加入数据
/**
* 表格列表
*
* @param agreeParty
*/
private void showCahLayout(String fang, String agreeParty) {
View cashView = View
.inflate(context, R.layout.single_cash_twomodify_layout, null);
TextView nameText = (TextView) cashView
.findViewById(R.id.fang_name_text);
EditText outEdit = (EditText) cashView
.findViewById(R.id.outflow_edittext);
TextView dateText = (TextView) cashView
.findViewById(R.id.date_edittext);
nameText.setText(fang);
setDate(dateText);
cash.add(greeParty,outEdit,dateText);//将封装的对象加入列表
cashListLayout.addView(cashView);
}
8.判断数据
cash.getIsEquality()
组合模式降低了类间的耦合,提高了系统的健壮性
over;