【学习期】java领域模式分层

领域模型设计书籍曾描述过领域模型可分为4层,分别是
1、用户界面层
负责向用户显示信息和解释用户指令
2、应用层
定义软件要完成的任务,并指挥表达领域概念的对象来解决问题
3、领域层(模型层)
负责表达业务概念,业务状态信息以及业务规则
4、基础设施层
为各层提供通用的技术能力,为应用层传递消息,为领域层提供持久化机制。
在结合实际的开发经验与书本的知识,认为在开发过程中可落地成如下几层:
Controller层【用户界面层】、Service层【应用层】、Action层【应用层】、entity层【领域层】、DAO层【基础设施层】。

 

 

  • Controller层【用户界面层】:负责与界面或其他系统的对接,相当于一个系统的门户。所有其他非本系统的用户都应该先将请求提交给Cotroller层。

    作用:
    1、负责接待外来用户,并将请求传递给下一层
    2、校验请求的合法性【如:判断用户合法性,请求参数合理性】
    3、相应用户请求【系统将请求处理完毕后,将返回的结果组合成用户想要的结果】

 
  1. 代码:

  2. package com.csosm.layout.controller;

  3. import java.util.List;

  4. import java.util.Map;

  5. import java.util.stream.Collectors;

  6. import javax.annotation.Resource;

  7. import javax.servlet.http.HttpServletRequest;

  8. import org.apache.commons.collections.MapUtils;

  9. import org.springframework.web.bind.annotation.RequestBody;

  10. import org.springframework.web.bind.annotation.RequestMapping;

  11. import org.springframework.web.bind.annotation.ResponseBody;

  12. import com.csosm.layout.service.EmployeeService;

  13. import com.google.common.base.Splitter;

  14. /**

  15. * 用户界面层,为前端或其他系统用户提供访问接口

  16. * @author bear

  17. *

  18. */

  19. @RequestMapping("/employee")

  20. public class EmployeeController {

  21. /**

  22. * 对外提供添加为导购添加会员接口

  23. * @param requestMap 请求数据(memberIds:【注:会员ID集合,会员ID间以逗号隔开】,employeeId:【注:导购ID】)

  24. * @param request

  25. * @return 视图

  26. */

  27. @RequestMapping(value = "/members/add.json")

  28. @ResponseBody

  29. public Map<String,Object> addMembers(@RequestBody Map<String, String> requestMap,

  30. HttpServletRequest request){

  31. //进行请求参数校验

  32. if(!requestMap.containsKey("memberIds")&&!requestMap.containsKey("employeeId"))

  33. throw new IllegalArgumentException("请求参数缺少[memberIds]或[employeeId]");

  34. //从请求参数中提取会员ID集合

  35. List<Integer> memberIds = Splitter.on(",").splitToList(MapUtils.getString(requestMap, "memberIds"))

  36. .stream().map(x -> Integer.parseInt(x)).collect(Collectors.toList());

  37. //从请求参数中提取导购ID

  38. Integer employeeId = MapUtils.getInteger(requestMap, "employeeId");

  39. employeeService.addMembers(employeeId, memberIds);

  40. return null;//自行定义返回成功

  41. }

  42. @Resource

  43. private EmployeeService employeeService;

  44. }`

 
  1. Service层【应用层】:对接Controller层,为Controller层的每一个请求提供对应的接口,为下一层Action层做数据准

  2. 作用:

  3. 1、将controller传递的数据还原成对象

  4. 2、进行跨对象逻辑处理

 
  1. 代码:

  2. package com.csosm.layout.service;

  3. import java.util.Collection;

  4. import java.util.Objects;

  5. import javax.annotation.Resource;

  6. import org.apache.commons.collections.CollectionUtils;

  7. import com.csosm.layout.action.EmployeeAction;

  8. import com.csosm.layout.action.MemberAction;

  9. import com.csosm.layout.entity.Employee;

  10. import com.csosm.layout.entity.Member;

  11. /**

  12. * Employee的应用层,可跨对象操作

  13. * @author bear

  14. *

  15. */

  16. public class EmployeeService {

  17. /**

  18. * 为导购添加多个会员

  19. * @param employeeId 导购ID

  20. * @param memberIds 会员ID

  21. */

  22. public void addMembers(Integer employeeId,Collection<Integer> memberIds) {

  23. Objects.requireNonNull(employeeId,"导购ID[employeeId]不能为空");

  24. if(CollectionUtils.isEmpty(memberIds)) return ;//如果传入的会员ID为空,则返回

  25. Employee employee = employeeAction.getById(employeeId);

  26. Collection<Member> members = memberAction.getByIds(memberIds);

  27. if(CollectionUtils.isEmpty(members)) return ;//如果根据会员ID获取的会员数目为空,则返回

  28. employeeAction.addMembers(employee, members);

  29. }

  30. @Resource

  31. private EmployeeAction employeeAction;

  32. @Resource

  33. private MemberAction memberAction;

  34. }

 
  1. * Action层【应用层】:该层只对Entity层负责,是Entity层对外提供的接口

  2. 作用:

  3. 1、为系统内部提供操作实体的接口

  4. 2、调用dao层持久化对象

 
  1. 代码:

  2. package com.csosm.layout.action;

  3. import java.util.Collection;

  4. import java.util.List;

  5. import java.util.Objects;

  6. import javax.annotation.Resource;

  7. importorg.apache.commons.collections.CollectionUtils;

  8. import com.csosm.layout.dao.EmployeeDAO;

  9. import com.csosm.layout.entity.Employee;

  10. import com.csosm.layout.entity.Member;

  11. /**

  12. * 独属于Employee对象的应用层

  13. * 尽量使用对象

  14. * @author bear

  15. *

  16. */

  17. public class EmployeeAction {

  18. /**

  19. * 给导购添加多个会员

  20. * @param employee 导购

  21. * @param members 多个会员

  22. */

  23. public void addMembers(Employee employee,Collection<Member> members) {

  24. Objects.requireNonNull(employee,"导购[employee]不能为空");//校验导购

  25. if(CollectionUtils.isEmpty(members)) return ;//校验会员

  26. employee.addMembers(members);//业务逻辑处理,为导购添加会员

  27. empDao.updateEmployee(employee);//持久化到数据库

  28. }

  29. /**

  30. * 根据导购ID获取导购对象

  31. * @param employeeId

  32. * @return

  33. */

  34. public Employee getById(Integer employeeId) {

  35. Objects.requireNonNull(employeeId,"导购ID[employeeId]不能为空");

  36. Employee employee = empDao.selectById(employeeId);

  37. if(null == employee)

  38. throw new IllegalStateException(String.format("不存在导购[%s]", employeeId));

  39. return employee;

  40. }

  41. @Resource

  42. private EmployeeDAO empDao;

  43. }

 
  1. package com.csosm.layout.action;

  2. import java.util.Collection;

  3. import java.util.Collections;

  4. import javax.annotation.Resource;

  5. import org.apache.commons.collections.CollectionUtils;

  6. import com.csosm.layout.dao.MemberDAO;

  7. import com.csosm.layout.entity.Member;

  8. /**

  9. * 独属于Member对象的应用层

  10. * @author bear

  11. *

  12. */

  13. public class MemberAction {

  14. /**

  15. * 根据会员ID获取会员对象

  16. * @param memberIds

  17. * @return

  18. */

  19. public Collection<Member> getByIds(Collection<Integer> memberIds){

  20. if(CollectionUtils.isEmpty(memberIds)) return Collections.EMPTY_LIST;//如果会员ID为空则返回空列表

  21. return memberDao.selectByIds(memberIds);

  22. }

  23. @Resource

  24. private MemberDAO memberDao;

  25. }

 
  1. * Entity层【领域层】:所有的业务操作集中在Entity层。

  2. 作用:

  3. 1、进行业务逻辑的处理

 
  1. 代码:

  2. package com.csosm.layout.entity;

  3. import java.util.Collection;

  4. import java.util.List;

  5. import java.util.Objects;

  6. import java.util.stream.Collectors;

  7. import org.apache.commons.collections.CollectionUtils;

  8. import com.google.common.collect.Lists;

  9. public class Employee {

  10. //导购ID

  11. private final Integer id;

  12. //导购名称

  13. private String name;

  14. //导购门店

  15. private Integer storeId;

  16. //导购手上的会员 ,初始化为空

  17. private List<Integer> memberIds = Lists.newArrayList();

  18. public Employee(Integer id, String name, Integer storeId) {

  19. super();

  20. this.id = id;

  21. this.name = name;

  22. this.storeId = storeId;

  23. }

  24. /**

  25. * 添加单个会员

  26. * @param member

  27. */

  28. public void addMember(Member member) {

  29. Objects.requireNonNull(member,"入参member不能为空");//检验会员

  30. this.memberIds.add(member.getId());

  31. }

  32. /**

  33. * 为导购添加多个会员

  34. * @param members

  35. */

  36. public void addMembers(Collection<Member> members) {

  37. if(CollectionUtils.isEmpty(members)) return ;//如果没有传入会员则返回

  38. this.memberIds.addAll(members.stream().map(x -> x.getId()).collect(Collectors.toSet()));

  39. }

  40. public String getName() {

  41. return name;

  42. }

  43. public void setName(String name) {

  44. this.name = name;

  45. }

  46. public Integer getStoreId() {

  47. return storeId;

  48. }

  49. public void setStoreId(Integer storeId) {

  50. this.storeId = storeId;

  51. }

  52. public List<Integer> getMemberIds() {

  53. return memberIds;

  54. }

  55. public Integer getId() {

  56. return id;

  57. }

  58. //toString、equals、hasCode 方法就不写了

  59. }

 
  1. package com.csosm.layout.entity;

  2. public class Member {

  3. //会员ID

  4. private final Integer id;

  5. //会员 名称

  6. private String name;

  7. //会员电话

  8. private String phone;

  9. //会员性别

  10. private int sex;

  11. public Member(Integer id, String name, String phone, int sex) {

  12. super();

  13. this.id = id;

  14. this.name = name;

  15. this.phone = phone;

  16. this.sex = sex;

  17. }

  18. public String getName() {

  19. return name;

  20. }

  21. public void setName(String name) {

  22. this.name = name;

  23. }

  24. public String getPhone() {

  25. return phone;

  26. }

  27. public void setPhone(String phone) {

  28. this.phone = phone;

  29. }

  30. public int getSex() {

  31. return sex;

  32. }

  33. public void setSex(int sex) {

  34. this.sex = sex;

  35. }

  36. public Integer getId() {

  37. return id;

  38. }

  39. }

* dao层【基础设施层】:实现将对象持久化到数据库
 
  1. 代码:

  2. package com.csosm.layout.dao;

  3. import com.csosm.layout.entity.Employee;

  4. /**

  5. * 独属于Employee的持久化层

  6. * @author bear

  7. *

  8. */

  9. //以下操作可采取MYbatis的方式,也可以采取spring自带的jdbcTemplate的方式就行对象持久化并与数据进行交互

  10. public class EmployeeDAO {

  11. /**

  12. * 更新导购对象到数据库

  13. * @param employee 导购

  14. */

  15. public void updateEmployee(Employee employee) {

  16. //TODO 实现对象持久化

  17. }

  18. /**

  19. * 根据导购ID从数据库中提取导购对象

  20. * @param id 导购ID

  21. * @return

  22. */

  23. public Employee selectById(Integer id) {

  24. //TODO 从数据库中获取导购对象

  25. return null;

  26. }

  27. }

  28. package com.csosm.layout.dao;

  29. import java.util.Collection;

  30. import com.csosm.layout.entity.Member;

  31. /**

  32. * 独属于Member的持久化层

  33. * @author bear

  34. *

  35. */

  36. //以下操作可采取MYbatis的方式,也可以采取spring自带的jdbcTemplate的方式就行对象持久化并与数据进行交互

  37. public class MemberDAO {

  38. /**

  39. * 根据多个会员ID从数据库获取多个会员

  40. * @param memberIds 会员ID集合

  41. * @return

  42. */

  43. public Collection<Member> selectByIds(Collection<Integer> memberIds){

  44. //TODO 从数据库提取会员信息

  45. return null;

  46. }

  47. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值