Java 使用复合模式进行验证

Java 使用复合模式进行验证,java,android,Java,Android,有人能解释一下我如何使用复合设计模式来验证android中的注册表吗。在这个表单中,我有8个编辑文本字段(用户名、密码、重新输入密码、城市、性别、年龄、电话号码、电子邮件)。我已经用这个代码验证了它 public boolean validateInput() { boolean validated = true; if (mUserValues.getCity() == null || mUserValues.getCity().isEmpty()) {

有人能解释一下我如何使用复合设计模式来验证android中的注册表吗。在这个表单中,我有8个编辑文本字段(用户名、密码、重新输入密码、城市、性别、年龄、电话号码、电子邮件)。我已经用这个代码验证了它

    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
代码与字段的数量和验证方式完全无关。添加一个文件不需要更改其中的任何内容


使用组合还是继承取决于您。但是使用是一件好事。

模式很好,但是如果它已经对您起作用,并且您不需要使用该模式,那么就不要使用它。“我的朋友说”不是改变你计划的理由。现在,如果您希望此表单能够在运行时更改或动态创建,那么您可能有一个很好的理由使用复合模式来处理它。感谢您的快速回答:)