Pattern-No.01 设计模式之服务器提供者框架模式

服务提供者框架模式


    定义:多个服务提供者实现一个服务,系统为客户端提供多个实现,并把他们从多个实现中解耦出来。服务提供者的改变对客户端来说是透明的,这样提供了更好的可扩展性。如:JDBC

135233_tOi2_239973.jpg

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

转载于:https://my.oschina.net/shma1664/blog/316042

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值