一、设计模式——策略模式,在项目中的应用

今天想介绍一下我工作当中用到的一个比较好的实践——模板方法模式实现扩展性良好的服务。抛砖引玉,希望各路大牛指教。

首先,简单介绍一下策略模式。

策略模式原材料:

1)一个接口,用于规范一系列策略,暴露统一的接口。

2)抽象类,可有可无,主要用于提供辅助类。

3)一系列策略类。


回到实际,如果我们需要编写一个WebService,提供注册,登录,验证,等等的功能,下面是模板方法模式的实践过程。

/**
    统一的接口
**/
public interface IService {

	public Response doService(Request request);
}
/**
    辅助类
**/
public abstract class AbstractClass {

	public Object json2Object(String json) {
		
		//此处代表公共方法
		//一般来说,会有工具类做JSON转换
		
		return new Object();
	}
}
/**
    登录服务
**/
public class LoginService extends AbstractClass implements IService {

	@Override
	public Response doService(Request request) {
		
		String body = request.getBody();
		
		// 通常body会是JSON格式字符串,需要在此转成Object对象
		Object user = json2Object(body);
		
		Response response = new Response();
		if (validate(user)) {
			response.setMessage("Login Successfully");
			response.setCode("0000");
		} else {
			response.setMessage("Login Failed");
			response.setCode("9999");
		}
		return response;
	}
	
	private boolean validate(Object user) {
		
		//...此处逻辑省略...
		
		return true;
	}

}


除了登录之后, 还可以有注册,验证,一大堆。同样的道理。

最后,入口就可以很潇洒的写成这样,又木有一种很容易扩展的赶脚。

public class Entry {

	Map<String,IService> services = new HashMap<String,IService>();

	public Response doProcess(Request request) {
		
		IService service = services.get(request.getHead());
		try {
			
			return service.doService(request);
			
		} catch (Exception e) {
			Response response = new Response();
			response.setCode("9999");
			response.setMessage(e.getMessage());
			return response;
		}
	}
	
	private void init() {
		services.put(LoginService.class.getName(), new LoginService());
		services.put(SiginService.class.getName(), new SiginService());
		services.put(ValidateService.class.getName(), new ValidateService());
	}
}


转载于:https://my.oschina.net/gaohongtian/blog/485298

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值