服务提供者框架模式
定义:多个服务提供者实现一个服务,系统为客户端提供多个实现,并把他们从多个实现中解耦出来。服务提供者的改变对客户端来说是透明的,这样提供了更好的可扩展性。如:JDBC
package cn.guagua.mobile.starlist.date;
/**
* 服务定义接口:查询日期区间接口
* @author shma
* @date 2014-09-17 15:34:42
*
*/
public interface IDateInterval {
//获取区间第一天日期
public String getFirstDate();
//获取区间最后一天日期
public String getLastDate();
}
package cn.guagua.mobile.starlist.date;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import org.apache.log4j.Logger;
/**
* 服务定义抽象类:查询日期区间抽象类
* @author shma
* @date 2014-09-17 15:37:37
*
*/
public abstract class AbDateInterval implements IDateInterval {
protected Calendar calender = new GregorianCalendar();
protected static final Logger logger = Logger.getLogger(AbDateInterval.class);
protected static final SimpleDateFormat DATE_FORMATER = new SimpleDateFormat("yyyyMMdd");
}
package cn.guagua.mobile.starlist.date;
import java.util.Calendar;
import java.util.Date;
/**
* 服务定义接口实现类:本周日期区间类
* @author shma
* @date 2014-09-17 15:36:31
*
*/
public class CurrWeekDateInterval extends AbDateInterval {
/**
* 返回指定日期所在周的第一天
* @param date 日期
* @return 所在周的第一天日期格式化结果
*/
public String getFirstDate() {
calender.setFirstDayOfWeek(Calendar.MONDAY);
calender.setTime(new Date());
calender.set(Calendar.DAY_OF_WEEK, calender.getFirstDayOfWeek()); // Monday
String monday = DATE_FORMATER.format(calender.getTime());
logger.info("所在周第一天:" + monday);
return monday;
}
/**
* 返回指定日期所在周的最后一天
* @param date 日期
* @return 所在周的最后一天日期格式化结果
*/
public String getLastDate() {
calender.setFirstDayOfWeek(Calendar.MONDAY);
calender.setTime(new Date());
calender.set(Calendar.DAY_OF_WEEK, calender.getFirstDayOfWeek() + 6); // Sunday
String sunday = DATE_FORMATER.format(calender.getTime());
logger.info("所在周最后一天:" + sunday);
return sunday;
}
}
package cn.guagua.mobile.starlist.date;
import java.util.Calendar;
import java.util.Date;
/**
* 服务定义接口实现类:上一周日期区间类
* @author shma
* @date 2014-09-17 15:36:31
*
*/
public class PrevWeekDateInterval extends AbDateInterval {
/**
* 返回指定日期上周的第一天
* @param date 日期
* @return 上周的第一天日期格式化结果
*/
public String getFirstDate() {
Calendar cal =Calendar.getInstance();
cal.add(Calendar.WEEK_OF_MONTH, -1);
cal.set(Calendar.DAY_OF_WEEK, 2);
String monday = DATE_FORMATER.format(cal.getTime());
logger.info("上周第一天:" + monday);
return monday;
}
/**
* 返回指定日期上周的最后一天
* @param date 日期
* @return 上周的最后一天日期格式化结果
*/
public String getLastDate() {
Calendar cal =Calendar.getInstance();
cal.set(Calendar.DAY_OF_WEEK, 1);
String sunday = DATE_FORMATER.format(cal.getTime());
logger.info("所在周最后一天:" + sunday);
return sunday;
}
}
package cn.guagua.mobile.starlist.date;
/**
* 获取时间服务提供者接口类
* @author shma
* @date 2014-09-17 16:08:08
*
*/
public interface IDateIntervalProvider {
public IDateInterval newDateInterval();
}
package cn.guagua.mobile.starlist.date;
/**
* 当前周日期服务器提供者实现类
* @author shma
* @date 2014-09-17 16:09:35
*
*/
public class CurrWeekDateIntervalProvider implements IDateIntervalProvider {
public static final String DEFAULT_KEY_NAME = "curr_week";
static {
DateServerManager.registerProvider(DEFAULT_KEY_NAME, new CurrWeekDateIntervalProvider());
}
public IDateInterval newDateInterval() {
// TODO Auto-generated method stub
return new CurrWeekDateInterval();
}
}
package cn.guagua.mobile.starlist.date;
/**
* 上周周日期服务器提供者实现类
* @author shma
* @date 2014-09-17 16:09:35
*
*/
public class PrevWeekDateIntervalProvider implements IDateIntervalProvider {
public static final String DEFAULT_KEY_NAME = "prev_week";
static {
DateServerManager.registerProvider(DEFAULT_KEY_NAME, new PrevWeekDateIntervalProvider());
}
public IDateInterval newDateInterval() {
return new PrevWeekDateInterval();
}
}
package cn.guagua.mobile.starlist.date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 服务提供者注册类
* @author shma
* @date 2014-09-17 16:14:33
*
*/
public class DateServerManager {
private static final Map<String, IDateIntervalProvider> providers = new ConcurrentHashMap<String, IDateIntervalProvider>();
static {
try {
Class.forName("cn.guagua.mobile.starlist.date.CurrWeekDateIntervalProvider");
Class.forName("cn.guagua.mobile.starlist.date.PrevWeekDateIntervalProvider");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private DateServerManager() {
}
public static void registerProvider(String name, IDateIntervalProvider provider) {
providers.put(name, provider);
}
public static IDateInterval getDateService(String name) {
IDateIntervalProvider provider = providers.get(name);
if(provider == null) {
throw new IllegalArgumentException(
"No provider registered with name: " + name);
}
return provider.newDateInterval();
}
}
package cn.guagua.mobile.starlist.date;
public class Test {
public static void main(String[] args) {
IDateInterval date = DateServerManager.getDateService("curr_week");
System.out.println(date.getFirstDate());
System.out.println(date.getLastDate());
date = DateServerManager.getDateService("prev_week");
System.out.println(date.getFirstDate());
System.out.println(date.getLastDate());
}
}
http://liwenshui322.iteye.com/blog/1267202