最近的一个项目中要用到时间上的判断,于是翻查以前做过的东西,有个片段是用策略模式判断时间处理的,当时漏了小结,现在再
归纳之
场景:用户输入时间,格式可以为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;
}