【设计模式】Java服务开发应用策略模式的一个例子
来源:互联网 发布:淘宝装修主页 编辑:程序博客网 时间:2024/06/05 21:15
当我们写代码时遇到了需要if else 需要实现的问题时,就可以考虑是否引入某种设计模式,能让代码写得更加graceful。
假设我们现在有个设计用户查找的RESTful接口的需求,用户可能有多个属性,有id,firstName ,lastName,age,adress 等等,我们可以这样一个接口:
http://localhost:8099/api?method=petclinic.owner.get&version=1.0&key=id&value=1&format=json
key值表示我们可以根据什么来查询,比如根据id来查询,则key为id,根据lastName来查询,则key为lastName。value则为对应的值。
接口规则设定好后,则需要进行后端controller层的编码工作了。
@ServiceMethod(value = "petclinic.owner.get", version = "1.0") public Collection<Owner> getOwner (@RequestParam String key,@RequestParam String value){ //TODO: }
key值可以取不同的值,我们自然想到这样的处理方式。
下面是基于if else的TODO部分实现
@ServiceMethod(value = "petclinic.owner.get", version = "1.0") public Collection<Owner> getOwner (@RequestParam String key,@RequestParam String value){ //TODO:if(key.equals("id")){//调用业务层方法findOwnerById获取用户列表return clinicBll.findOwnerById(value);}else if(key.equals("lastName"){//调用业务层方法findOwnerByLastName获取用户列表return clinicBll.findOwnerByLastName(value);} }
如果用策略模式该重构代码,则我们先需要抽象一个找用户的策略(是根据id来找?还是根据lastName来找?等等)。
package com.iflytek.petclinic.service.strategy;import com.iflytek.petclinic.model.Owner;import org.springframework.dao.DataAccessException;import java.util.Collection;public interface FindOwnerStrategy { Collection<Owner> findOwner(String value) throws DataAccessException;}
我们可以根据具体的找用户策略来实现不同的策略类。
下面是根据id来找的策略:
package com.iflytek.petclinic.service.strategy.impl;import com.iflytek.petclinic.bll.ClinicBll;import com.iflytek.petclinic.model.Owner;import com.iflytek.petclinic.service.strategy.FindOwnerStrategy;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.dao.DataAccessException;import java.util.Collection;public class FindOwnerByIdStrategy implements FindOwnerStrategy { @Autowired private ClinicBll clinicBll; public Collection<Owner> findOwner (String value) throws DataAccessException{ return clinicBll.findOwnerById(value); }}
下面是根据lastName来找的策略:
package com.iflytek.petclinic.service.strategy.impl;import com.iflytek.petclinic.bll.ClinicBll;import com.iflytek.petclinic.model.Owner;import com.iflytek.petclinic.service.strategy.FindOwnerStrategy;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.dao.DataAccessException;import java.util.Collection;public class FindOwnerByLastNameStrategy implements FindOwnerStrategy { @Autowired private ClinicBll clinicBll; public Collection<Owner> findOwner(String value) throws DataAccessException{ return clinicBll.findOwnerByLastName(value); }}
这样,我们在原来TODO的地方可以这样处理
@RestControllerpublic class OwnerService { @Resource(name = "findOwnerStrategyMap") private Map<String, FindOwnerStrategy> findOwnerStrategyMap ; @ServiceMethod(value = "petclinic.owner.get", version = "1.0") public Collection<Owner> getOwner (@RequestParam String key,@RequestParam String value){ FindOwnerStrategy findOwnerStrategy = findOwnerStrategyMap.get(key); return findOwnerStrategy.findOwner(value); }}
这里的findOwnerStrategyMap是个hashmap,key为策略名称,这里是id,loginName等等,value则为对应策略类实例的引用。具体在xml中配置。因为本文主要说的是策略模式,这些就略过了。
1 0
- 【设计模式】Java服务开发应用策略模式的一个例子
- 关于一个简单的策略设计模式的例子
- JAVA设计模式-策略模式应用实例
- 策略设计模式的应用
- JAVA开发的23种设计模式之 --- 策略模式
- JAVA策略模式例子
- 我的Java设计模式-策略模式
- 策略模式的java实现例子
- android应用开发设计模式之策略模式
- android应用开发设计模式之策略模式
- Java设计模式 -- 策略模式
- java设计模式-----策略模式
- java 设计模式-策略模式
- java设计模式--策略模式
- java设计模式-策略模式
- java设计模式-策略模式
- java设计模式--策略模式
- java设计模式---策略模式
- Ubuntu15.10配置redmine
- PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
- Oracle scott账户被锁定,scott默认密码,sys,system默认密码
- 正则表达式及java相关练习
- centos本地yum源错误引起问题
- 【设计模式】Java服务开发应用策略模式的一个例子
- 分析MockHttpServletRequestBuilder中content和param的区别
- 为or、in平反——or、in到底能不能利用索引?
- SQL 递归生成树
- mac下vim配置
- JMS简介与ActiveMQ实战
- Static关键字
- 贪心算法—Problem R
- miller-rabin