app第一阶段冲刺第十天

作者:@kuaiquxie
作者的github:https://github.com/bitebita
本文为作者原创,如需转载,请注明出处:https://www.cnblogs.com/dzwj/p/16196177.html


 

今天写数值匹配模式,然后编写相应的数值匹配模式调用文件

复制代码
package com.linlang.grasharepro.utils.validation;

/**
 * 数值匹配模式。作为配置项传递,其数据由Config来保存
 */
public enum ValuePattern {

    Required("此为必填项目"),

    MaxLength("长度不能超过{0}"),
    MinLength("长度不能小于{0}"),
    RangeLength("长度必须在[{0},{1}]之间"),

    MaxValue("数值不能超过{0}"),
    MinValue("数值不能小于{0}"),
    RangeValue("数值必须在[{0},{1}]之间"),

    EqualsTo("必须输入相同内容"),
    NotEqualsTo("必须输入不相同内容");

    private final String mDefMessage;
    private String mMessage;
    private int mMessageId = -1;

    private LazyLoader mLazyLoader;
    private ValueType mValueType;
    private String mMinValue;
    private String mMaxValue;
    private String mValue;

    private ValuePattern(String message){
        mDefMessage = message;
    }

    /**
     * 设置懒加载接口
     * @param lazyLoader 懒加载接口
     * @return ValuePattern实例
     */
    public ValuePattern lazy(LazyLoader lazyLoader) {
        mLazyLoader = lazyLoader;
        return this;
    }

    /**
     * 设置第一个参数值
     * @param first 数值
     * @return ValuePattern
     */
    public ValuePattern setFirstValue(double first){
        enforceFloatValueType();
        syncValue(first);
        return this;
    }

    /**
     * 设置第一个参数值
     * @param first 数值
     * @return ValuePattern
     */
    public ValuePattern setFirstValue(long first){
        enforceIntValueType();
        syncValue(first);
        return this;
    }

    /**
     * 设置第二个参数值
     * @param second 数值
     * @return ValuePattern
     */
    public ValuePattern setSecondValue(long second){
        enforceIntValueType();
        mMaxValue = String.valueOf(second);
        return this;
    }

    /**
     * 设置第二个参数值
     * @param second 数值
     * @return ValuePattern
     */
    public ValuePattern setSecondValue(double second){
        enforceFloatValueType();
        mMaxValue = String.valueOf(second);
        return this;
    }

    /**
     * 设置第一个参数值
     * @param value 数值
     * @return ValuePattern
     */
    public ValuePattern setValue(String value){
        syncValue(value);
        mValueType = ValueType.String;
        return this;
    }

    /**
     * 设置第一个参数值
     * @param value 数值
     * @return ValuePattern
     */
    public ValuePattern setValue(long value){
        syncValue(value);
        mValueType = ValueType.Int;
        return this;
    }

    /**
     * 设置第一个参数值
     * @param value 数值
     * @return ValuePattern
     */
    public ValuePattern setValue(double value){
        syncValue(value);
        mValueType = ValueType.Float;
        return this;
    }

    /**
     * 设置提示消息内容
     * @param message 消息内容
     */
    public ValuePattern setMessage(String message) {
        mMessage = message;
        return this;
    }

    /**
     * 设置提示消息内容的资源ID
     * @param msgId 资源ID
     */
    public ValuePattern setMessage(int msgId){
        mMessageId = msgId;
        return this;
    }

    String getMessage() {
        final String msg = mMessage == null ? mDefMessage : mMessage;
        mMessage = null;
        return msg;
    }

    int getMessageId() {
        final int msg = mMessageId <= 0 ? -1 : mMessageId;
        mMessageId = -1;
        return msg;
    }

    LazyLoader getLazyLoader() {
        final LazyLoader loader = mLazyLoader;
        mLazyLoader = null;
        return loader;
    }

    ValueType getValueType() {
        ValueType type = mValueType;
        mValueType = null;
        return type;
    }

    String getMinValue() {
        final String value = mMinValue;
        mMinValue = null;
        return value;
    }

    String getMaxValue() {
        final String value = mMaxValue;
        mMaxValue = null;
        return value;
    }

    String getValue() {
        final String value = mValue;
        mValue = null;
        return value;
    }

    private void syncValue(Object value){
        mValue = String.valueOf(value);
        mMinValue = mValue;
    }

    private void enforceIntValueType(){
        if (mValueType == null){
            mValueType = ValueType.Int;
        }else{
            if (!ValueType.Int.equals(mValueType)){
                throw new IllegalArgumentException("设置的数值类型必须同为整数");
            }

        }
    }

    private void enforceFloatValueType(){
        if (mValueType == null){
            mValueType = ValueType.Float;
        }else{
            if (!ValueType.Float.equals(mValueType)) {
                throw new IllegalArgumentException("设置的数值类型必须同为浮点数");
            }

        }
    }

    @Override
    public String toString() {
        return "{" +
                "name='" + name() + '\'' +
                ", messageId=" + mMessageId +
                ", message='" + mMessage + '\'' +
                ", lazyLoader=" + mLazyLoader +
                ", valueType=" + mValueType +
                ", minValue='" + mMinValue + '\'' +
                ", maxValue='" + mMaxValue + '\'' +
                ", value='" + mValue + '\'' +
                '}';
    }
}
复制代码

 

 

复制代码
package com.linlang.grasharepro.utils.validation;

import android.content.Context;
import android.text.TextUtils;
import android.widget.TextView;

import com.linlang.grasharepro.utils.validation.testers.AbstractValuesTester;
import com.linlang.grasharepro.utils.validation.testers.EqualsToTester;
import com.linlang.grasharepro.utils.validation.testers.MaxLengthTester;
import com.linlang.grasharepro.utils.validation.testers.MaxValueTester;
import com.linlang.grasharepro.utils.validation.testers.MinLengthTester;
import com.linlang.grasharepro.utils.validation.testers.MinValueTester;
import com.linlang.grasharepro.utils.validation.testers.NotEqualsToTester;
import com.linlang.grasharepro.utils.validation.testers.RangeLengthTester;
import com.linlang.grasharepro.utils.validation.testers.RangeValueTester;
import com.linlang.grasharepro.utils.validation.testers.RequiredValueTester;

/**
 * 输入框的匹配模式
 */
final class ValuePatternInvoker extends PatternInvoker<ValuePatternMeta, ValuePattern> {

    private static final String TAG = "ValueInvoker";

    ValuePatternInvoker(Context context, int viewId, TextView field, ValuePattern... patterns) {
        super(context, viewId, field);
        addPatterns(patterns);
    }

    @Override
    public Result performTest(){
        final String value = input.getText().toString();
        // 当输入内容为空时,如果第一个校验模式不是“Required”,则跳过后面的配置。
        final ValuePatternMeta first = patterns.get(0);
        if (TextUtils.isEmpty(value) && !ValuePattern.Required.equals(first.pattern)){
            return Result.passed(null);
        }
        final String inputKey = input.getClass().getSimpleName() + "@{" + input.getHint() + "}";
        for (ValuePatternMeta meta : patterns){
            meta.performLazyLoader();
            final AbstractValuesTester tester = findTester(meta);
            final boolean passed = tester.performTest(value);
            if (!passed){
                FireEyeEnv.verbose(TAG,
                        "[v] Performing: passed: NO, " + inputKey + "value: " + value + ", message: " + meta.message + ", tester: " + tester.getName());
                // 如果校验器发生异常,取异常消息返回
                String message = tester.getExceptionMessage();
                if (message == null) {
                    message = meta.getMessage();
                }
                return Result.reject(message, value);
            } else{
                FireEyeEnv.verbose(TAG,
                        "[v] Performing: passed: YES, " + inputKey + "value: " + value + ", message: " + meta.message + ", tester: " + tester.getName());
            }
        }
        FireEyeEnv.log(TAG, "[D] " + inputKey + " -> passed: YES, value: " + value);
        return Result.passed(value);
    }

    @Override
    protected boolean onFilter(ValuePatternMeta meta, ValuePattern item) {
        if (ValuePattern.Required.equals(item)){
            this.patterns.add(0, meta);
            return true;
        }else{
            return false;
        }
    }

    @Override
    protected ValuePatternMeta convert(ValuePattern item) {
        final ValuePatternMeta meta = ValuePatternMeta.parse(item);
        meta.convertMessage(context);
        FireEyeEnv.log(TAG, "[D] Value pattern meta -> " + meta.toString());
        return meta;
    }

    private AbstractValuesTester findTester(ValuePatternMeta meta){
        switch (meta.pattern){
            case EqualsTo:
                EqualsToTester equalsToTester = new EqualsToTester();
                switch (meta.valueType){
                    case Float:
                        equalsToTester.setFloatValue(Double.valueOf(meta.value));
                        break;
                    case Int:
                        equalsToTester.setIntValue(Long.valueOf(meta.value));
                        break;
                    case String:
                        equalsToTester.setStringValue(meta.value);
                        break;
                }
                return equalsToTester;
            case NotEqualsTo:
                NotEqualsToTester notEqualsToTester = new NotEqualsToTester();
                switch (meta.valueType){
                    case Float:
                        notEqualsToTester.setFloatValue(Double.valueOf(meta.value));
                        break;
                    case Int:
                        notEqualsToTester.setIntValue(Long.valueOf(meta.value));
                        break;
                    case String:
                        notEqualsToTester.setStringValue(meta.value);
                        break;
                }
                return notEqualsToTester;
            case MinLength:
                MinLengthTester minLengthTester = new MinLengthTester();
                minLengthTester.setIntValue(Long.parseLong(meta.value));
                return minLengthTester;
            case MaxLength:
                MaxLengthTester maxLengthTester = new MaxLengthTester();
                maxLengthTester.setIntValue(Long.parseLong(meta.value));
                return maxLengthTester;
            case MinValue:
                MinValueTester minValueTester = new MinValueTester();
                minValueTester.setFloatValue(Double.valueOf(meta.value));
                return minValueTester;
            case MaxValue:
                MaxValueTester maxValueTester = new MaxValueTester();
                maxValueTester.setFloatValue(Double.valueOf(meta.value));
                return maxValueTester;
            case RangeLength:
                RangeLengthTester rangeLengthTester = new RangeLengthTester();
                rangeLengthTester.setMinIntValue(Long.parseLong(meta.minValue));
                rangeLengthTester.setMaxIntValue(Long.parseLong(meta.maxValue));
                return rangeLengthTester;
            case RangeValue:
                RangeValueTester rangeValueTester = new RangeValueTester();
                rangeValueTester.setMinFloatValue(Double.valueOf(meta.minValue));
                rangeValueTester.setMaxFloatValue(Double.valueOf(meta.maxValue));
                return rangeValueTester;
            case Required:
                return new RequiredValueTester();
            default:
                return new RequiredValueTester(){
                    @Override
                    public boolean test(String content) {
                        return false;
                    }
                };
        }
    }

}
复制代码

 

posted @   kuaiquxie  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示