策略模式小例子

来源:互联网 发布:floyd最短路径矩阵 编辑:程序博客网 时间:2024/06/10 20:45

最近的一个项目中要用到时间上的判断,于是翻查以前做过的东西,有个片段是用策略模式判断时间处理的,当时漏了小结,现在再

归纳之

场景:用户输入时间,格式可以为yyyy-mm-dd ,也可以为 yyyy-mm-dd hh:mm,其他输出的格式为不合法,要求进行判断。而用的场

合需要规定
用yyyy-mm-dd 的标准来限制用户输入,有的场景又要用yyyy-mm-dd hh:mm的标准来输入,再扩展之,有的场景可能用其他的格式来

判断用户的输入。当然,可以不用策略模式,但如果用策略模式,也是可以的。现介绍之

接口:ValidatorInterface.java

import java.text.ParseException;
import java.util.Date;


/**
 * <pre>验证日期格式是否正确的接口,使用策略模式</pre>
 * @version  1.0,2006-01
 * @author  jackyrong
 */
public interface ValidatorInterface
{
    //是否正确日期格式
    public boolean isValidateTime(String s);

    //将字符串转换为日期类型
    public Date ConverToDate(String s) throws ParseException;
}


策略1的具体使用类:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class ValidatorStrategy1 implements ValidatorInterface
{


    /**
     * <pre>时间转换类,将用户输入的字符串转为Date类型</pre>
     * @param s 用户在ui层输入的会议时间
     * @return tempDate 转换后的Date类型
     * @throws ParseException
     */

    public java.util.Date ConverToDate(String s) throws ParseException
    {
        Locale locale = Locale.US;
        java.util.Date tempDate = null;
        java.text.DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm",
            locale);
        tempDate = df.parse(s);
        return tempDate;
    }


    /**
     * <pre>使用正则表达式判断用户输入的字符串是否符合yyyy-mm-dd hh:mm的格式</pre>
     *@param s 用户输入的字符串
     *@return isvalidatetime 是否为合法的输入
     */
    public boolean isValidateTime(String s)
    {
        boolean isvalidatetime;
        Pattern p = null; //正则表达式
        Matcher m = null;
        p =

Pattern.compile("^((((1[6-9]|[2-9]\\d)\\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2})-

(0?[13456789]|1[012])-(0?[1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-0?2-(0?[1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d

)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))(\\s)+(20|21|22|23|[0-1]?\\d):[0-5]?\\d$"

);
        m = p.matcher(s);
        isvalidatetime = m.matches();
        return isvalidatetime;
    }

}
值得留意的是,可以用上面的正则表达式来判断输入的字符串是否符合yyyy-mm-dd hh:mm的格式,

策略2的实现文件
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class ValidatorStrategy2 implements ValidatorInterface
{

    /**
     * <pre>时间转换类,将用户输入的字符串转为Date类型</pre>
     * @param s 用户在ui层输入的会议时间
     * @return tempDate 转换后的Date类型
     * @throws ParseException
     */

    public java.util.Date ConverToDate(String s) throws ParseException
    {
        Locale locale = Locale.US;
        java.util.Date tempDate = null;
        java.text.DateFormat df = new SimpleDateFormat("yyyy-MM-dd", locale);
        tempDate = df.parse(s);
        return tempDate;
    }


    /**
     * <pre>使用正则表达式判断用户输入的字符串是否符合yyyy-mm-dd的格式</pre>
     *@param s 用户输入的字符串
     *@return isvalidatetime 是否为合法的输入
     */
    public boolean isValidateTime(String s)
    {
        boolean isvalidatetime;
        Pattern p = null; //正则表达式
        Matcher m = null;
        p =

Pattern.compile("^((((1[6-9]|[2-9]\\d)\\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2})-

(0?[13456789]|1[012])-(0?[1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-0?2-(0?[1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d

)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$");
        m = p.matcher(s);
        isvalidatetime = m.matches();
        return isvalidatetime;
    }


}

 

Validator使用策略模式的类Validator.java
mport java.text.ParseException;


public class Validator
{
    private ValidatorInterface validator;

    public Validator(ValidatorInterface validator)
    {
        this.validator = validator;
    }

    public boolean getvalidator(String s)
    {
        return validator.isValidateTime(s);
    }

    /**
     * <pre>时间转换类,将用户输入的字符串转为Date类型</pre>
     * @param s 用户在ui层输入的会议时间
     * @return tempDate 转换后的Date类型
     * @throws ParseException
     */
    public java.util.Date ConverToDate(String s) throws ParseException
    {
        return validator.ConverToDate(s);
    }

}


前端使用策略模式的例子
//使用yyyy-mm-dd hh:mm的策略模式来验证日期
        ValidatorInterface v1 = new ValidatorStrategy1();
        Validator strategy = new Validator(v1);

        //判断输入开始日期是否合法
        if (!strategy.getvalidator(st)) {
            JOptionPane.showMessageDialog(this, "输入开始日期不合法", "提示",
                                          JOptionPane.PLAIN_MESSAGE);
            return;
        }


也可以再设计一个包装类,使用facade模式来封装
/**
 * <pre>ValidTime类,使用facade模式包装验证日期格式的功能</pre>
 * @version  1.0,2006-01
 * @author  jackyrong
 */
public class ValidTime
{
    private static boolean instance_flag = false;
    private ValidTime()
    {
    }

    public static ValidTime getValidTime()
    {
        if (!instance_flag) {
            return new ValidTime();
        }
        else {
            return null;
        }


    }

    /**
     * <pre>判断某个输入表示日期的字符串是否符合相关的格式</pre>
     * <pre>使用策略模式,分别检验是否符合两种指定的日期格式:yyyy-mm-dd或yyyy-mm-dd hh:mm</pre>
     *@param s 用户输入的字符串
     *@return isvalidtime 是否为合法的日期输入格式
     */

    public boolean isValidTime(String s)
    {
        boolean isvalidtime = false;
        //使用yyyy-mm-dd hh:mm的策略模式
        ValidatorInterface v1 = new ValidatorStrategy1();
        Validator strategy1 = new Validator(v1);

        //使用yyyy-mm-dd hh:mm:ss的策略模式
        ValidatorInterface v2 = new ValidatorStrategy2();
        Validator strategy2 = new Validator(v2);

        //如果输入的日期字符串符合两种格式之一,则被认识是正确的格式
        if (strategy1.getvalidator(s) || strategy2.getvalidator(s)) {
            isvalidtime = true;
        }
        return isvalidtime;
    }

}

上面的是可以用来判断用户的输入是否多种预先设定的输入的话,可以用上面的代码,而前端调用可以这样
 //判断输入开始日期是否合法
        if (!ValidTime.getValidTime().isValidTime(st)) {
            JOptionPane.showMessageDialog(this, "输入开始日期不合法", "提示",
                                          JOptionPane.PLAIN_MESSAGE);
            return;
        }

 

原创粉丝点击