【设计模式】Java服务开发应用策略模式的一个例子


当我们写代码时遇到了需要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的地方可以这样处理


@RestController
public 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整清晰版,完美书签. 《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,培养正确的“设计观”;高级内容则深入探讨如何理解这些模式,包括模式蕴涵什么样的设计思,模式的本质是什么,模式如何结合实际应用,模式的优缺点以及与其他模式的关系等,以期让读者尽量去理解和掌握每个设计模式的精髓所在。   《研磨设计模式》在内容上深入、技术上实用、和实际开发结合程度很高,书大部分的示例程序都是从实际项目简化而来,因此很多例子都可以直接拿到实际项目使用。如果你要深入透彻地理解和掌握设计模式,并期望能真正把设计模式应用到项目去,那么这是你不可错过的一本好书。   《研磨设计模式》难度为初级到级,适合与所有开发人员、设计人员或者即将成为开发人员的朋友。也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础    第2章 简单工厂    第3章 外观模式    第4章 适配器模式(Adapter)    第5章 单例模式(Singleton)    第6章 工厂方法模式(Factory Method)    第7章 抽象工厂模式(Abstract Factory)    第8章 生成器模式(Builder)    第9章 原型模式(Prototype)    第10章 介者模式(Mediator)    第11章 代理模式(Proxy)    第12章 观察者模式(Observer)    第13章 命令模式(Command)    第14章 迭代器模式(Iterator)    第15章 组合模式(Composite)    第16章 模板方法模式(Template Method)    第17章 策略模式(Strategy)    第18章 状态模式(State)    第19章 备忘录模式(Memento)    第20章 享元模式(Flyweight)    第21章 解释器模式(Interpreter)    第22章 装饰模式(Decorator)    第23章 职责链模式(Chain of Responsibility)    第24章 桥接模式(Bridge)    第25章 访问者模式(Visitor)    附录A常见面向对象设计原则    附录BUML简介    参考文献

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值