Java 使用复合模式进行验证
有人能解释一下我如何使用复合设计模式来验证android中的注册表吗。在这个表单中,我有8个编辑文本字段(用户名、密码、重新输入密码、城市、性别、年龄、电话号码、电子邮件)。我已经用这个代码验证了它Java 使用复合模式进行验证,java,android,Java,Android,有人能解释一下我如何使用复合设计模式来验证android中的注册表吗。在这个表单中,我有8个编辑文本字段(用户名、密码、重新输入密码、城市、性别、年龄、电话号码、电子邮件)。我已经用这个代码验证了它 public boolean validateInput() { boolean validated = true; if (mUserValues.getCity() == null || mUserValues.getCity().isEmpty()) {
public boolean validateInput() {
boolean validated = true;
if (mUserValues.getCity() == null || mUserValues.getCity().isEmpty()) {
mCityEditText.setError(getString(R.string.error));
validated = false;
}
if (mUserValues.getEmail() == null || mUserValues.getEmail().isEmpty()) {
Log.d("mEmail", "in mEmail");
mEmail.setError(getString(R.string.error));
validated = false;
}
if (mUserValues.getPassword() == null
|| mUserValues.getPassword().isEmpty()) {
mPasswordEditText.setError(getString(R.string.error));
validated = false;
}
if (mUserValues.getPasswordCheck() == null
|| mUserValues.getPasswordCheck().isEmpty()) {
mPasswordConfirm.setError(getString(R.string.error));
validated = false;
}
if (mUserValues.getPassword() != null
&& mUserValues.getPasswordCheck() != null
&& !mPasswordEditText.getText().toString()
.equals(mPasswordEditText.getText().toString())) {
mPasswordEditText.setError(getString(R.string.pass_check));
mPasswordConfirm.setError(getString(R.string.pass_check));
validated = false;
}
if (mUserValues.getSex() == null || mUserValues.getSex().isEmpty()) {
mSex.setError(getString(R.string.error));
validated = false;
}
if (mUserValues.getPhoneNumber() == 0) {
mPhone.setError(getString(R.string.error));
validated = false;
}
Pattern pattern = Pattern.compile(Constants.EMAIL_PATTERN);
Matcher matcher = pattern.matcher(mEmail.getText().toString());
mEmailCheck = matcher.matches();
if (mEmailCheck == false) {
mEmail.setError(getString(R.string.email_valid));
validated = false;
}
if (mUserValues.getUsername().length() <= 2) {
mUsername.setError(getString(R.string.username_check));
validated = false;
}
if ((mUserValues.getAge() < 18 || mUserValues.getAge() > 150)
&& mUserValues.getAge() > 0) {
mAge.setError(getString(R.string.age_check));
validated = false;
}
return validated;
}
public boolean validateInput(){
布尔值=真;
if(mUserValues.getCity()==null | | mUserValues.getCity().isEmpty()){
setError(getString(R.string.error));
验证=假;
}
if(mUserValues.getEmail()==null | | mUserValues.getEmail().isEmpty()){
日志d(“mEmail”、“in mEmail”);
setError(getString(R.string.error));
验证=假;
}
if(mUserValues.getPassword()==null
||mUserValues.getPassword().isEmpty()){
mPasswordEditText.setError(getString(R.string.error));
验证=假;
}
if(mUserValues.getPasswordCheck()==null
||mUserValues.getPasswordCheck().isEmpty()){
mPasswordConfirm.setError(getString(R.string.error));
验证=假;
}
如果(mUserValues.getPassword()!=null
&&mUserValues.getPasswordCheck()!=null
&&!mPasswordEditText.getText().toString()
.equals(mPasswordEditText.getText().toString()){
mPasswordEditText.setError(getString(R.string.pass_check));
mPasswordConfirm.setError(getString(R.string.pass_check));
验证=假;
}
if(mUserValues.getSex()==null | | mUserValues.getSex().isEmpty()){
mSex.setError(getString(R.string.error));
验证=假;
}
if(mUserValues.getPhoneNumber()==0){
setError(getString(R.string.error));
验证=假;
}
Pattern=Pattern.compile(Constants.EMAIL\u模式);
Matcher Matcher=pattern.Matcher(mEmail.getText().toString());
mEmailCheck=matcher.matches();
if(mEmailCheck==false){
mEmail.setError(getString(R.string.email_valid));
验证=假;
}
if(mUserValues.getUsername().length()150)
&&mUserValues.getAge()>0){
mAge.setError(getString(R.string.age_check));
验证=假;
}
返回验证;
}
我的一个朋友告诉我,可以使用复合设计模式来实现,但我真的不明白如何实现。
如果有人能解释一下,我将不胜感激。
提前感谢。您当前正在从外部检查对象的状态(例如,
if(mUserValues.getCity()==null)
)。如果您将一个字段添加到mUserValues
中,您还必须将处理该字段的代码添加到validateInput
根据面向对象的原则,这是不好的封装/强耦合。该对象应该处理/验证其内部状态本身(或者知道另一个可以处理它的对象->复合模式)
我会在第一步中将验证移到对象内部(例如,if(!mUserValues.validateCity())
)
在此之后,您仍然需要了解外部的mUserValues
对象的内部信息-例如,知道有一个城市字段需要验证
所以在下一步你也可以摆脱它。结果可能大致类似于
public boolean validateInput() {
boolean validated = true;
for (ValidatableField field : mUserValues.getValidatableFields()) {
if (!field.isValid()) {
field.showError(R.string.error);
validated = false;
}
}
return validated;
}
现在,validateInput
代码与字段的数量和验证方式完全无关。添加一个文件不需要更改其中的任何内容
使用组合还是继承取决于您。但是使用是一件好事。模式很好,但是如果它已经对您起作用,并且您不需要使用该模式,那么就不要使用它。“我的朋友说”不是改变你计划的理由。现在,如果您希望此表单能够在运行时更改或动态创建,那么您可能有一个很好的理由使用复合模式来处理它。感谢您的快速回答:)