背景

一个问题,我们要把它搞清楚。需要深入的思考,从演进出发,从核心出发,探索它的本质。这样才能在工作中举一反三。探索本质的思想,对于架构者来说尤其重要。本文想探讨架构模式之分层设计的本质和核心。以便于更好的将正确的方式应用到项目中。

为什么分层

三层架构,多层架构我们听到的很多,那有没有考虑过为什么需要分层呢?不分不是更简单更方便吗,何必大费周折搞出一个分层架构?

举一个例子,如果我们开一个饭店,一个人把采购,炒菜,上菜全部做了,一个月也有不错的收入。只是会比较忙,很辛苦。因为自己的能力毕竟有限,有时候也会把事情搞错,再比如哪天生病了,生意就没法做了。当人多了的时候就忙不过来了,大批的顾客就会跑到别人的饭店。这时候,我们就会考虑雇人,人多了就会考虑分工的问题,有的负责采购,有的负责炒菜,有的负责上菜,这样实际分层就产生了。

分层本质是解耦和分类,解决职责不清的耦合问题,解决职责过大不利于发展的问题,在分层的基础上为团队分工和协作提供了依据。

分层的好处

1、  隔离业务复杂度和技术复杂度,可独立变化发展

2、  职责清晰,减少耦合,提高复用性,可维护性,扩展性(部分)

3、  有利于团队分工协作

分层的不足

1、  代码理解的复杂度高了

2、  性能低了,原本一次完成的事情,需要调多层实现

3、  管理成本高了,需要考虑每层的边界,代码结构和团队情况

如何分层

分层设计也是一种抽象的思想,每层代表一个关注点,多层之间的协作实现了整个调用链路。

1、  基于职责(关注点)不同进行分层

2、  基于变化的程度进行分层

3、  同一抽象层次的组件放在同一层

分层中的设计思想

如果用一句话描述的话,个人理解的就是高内聚,松耦合。展开讲的话有以下几点

1、  单一职责原则,分离关注点,每个层的职责是单一的,只做一类事情;

2、  开闭原则:隔离变化,对扩展开放,对修改关闭;

3、  依赖倒置原则:基于接口(抽象)编程,层与层之间的调用都应该依赖抽象而不是具体。

分层的方式

一般讲的都是逻辑分层,实际也存在物理层面进行分层。

物理分层(Tier

主要从物理元素切入,个人理解从物理层面有两类,一类从部署的角度考虑,一类从项目结构角度。

从部署角度考虑,典型的J2EE N Tire架构,如下图:

大型分布式系统的分层(简化版),如下:

从项目结构考虑(很少有人这么讲)1、项目的分包结构;2、maven中的父子项目。

逻辑分层(Layer

大家常见的分层方式,典型的有三层,四层,七层,如下。

其中三层和四层从结构上看相差不大,主要是在三层数据访问层的基础上,扩展了如服务,设备等的调用。但是从架构层面,已经有比较大的改进。

一个架构设计到这个程度就可以了吗?远远不够,下一步需要对分层架构进行细化。

分层详解

在做设计的时候,需要将每一个组件,每一个角色落地,让各个参与者都能清楚,明白。以四层架构为例,详细介绍每层的关注点和设计。

1、  明确各层的关注点和职责。

(1)       表现层

关注点:用户交互和页面渲染

职责:接收用户输入,调用业务逻辑层,接收业务逻辑返回实现页面渲染。

(2)       业务逻辑层

关注点:领域模型和业务逻辑

职责:系统的核心部分,实现业务逻辑和业务规则,实现事务控制,调用资源访问层;

(3)       资源整合层:

关注点:各类资源的调用和隔离

职责:整合数据访问(读写),整合外部接口,整合设备交互。

2、  明确各层的设计(代码级)

上图已经把代码层面的组件画出来了,按照这个方案就可以进行开发了。

(1)      VO,BO,Entity可以使用同一套实体类也可以分开,比较推荐的做法是VO和BO使用一套,Entity使用一套。

(2)      业务逻辑层:抽象了Logic接口,用于定义每个服务方法的步骤,该部分会有一些通用的Logic用于多个服务方法复用。Service会调用具体的Logic实现逻辑逻辑,达到了最大程度的解耦和复用。

(3)   业务逻辑层:对于Logic内复用的,可以下沉到Manager中。

(4)      业务逻辑层:还可以在Servide的基础上封装一层Façade,用于聚合多个Servie方法的调用。

(5)资源整合层:包含传统的数据库访问层结构和,调用接口的实现。调用接口使用代理模式实现,隔离了外部差异。复杂的话,可以考虑使用策略+适配器的方式。

3、  层之间的调用关系

标准的调用是严格按照上次调用下层的顺序,实际也可以跨层调用(根据团队规范,约定好)。但是,应避免循环调用。

物理分层与逻辑分层的关系

逻辑架构会以不同的方式,表现到物理架构中。拿分层来讲,常见的方式有全部逻辑分层一起部署,逻辑分层部分分开部署和逻辑分层完全分开部署。分开部署后会涉及到RPC调用和服务高可用等问题。

文章总结

分层架构是项目中用到的最多的架构模式之一,核心思想是归类和解耦,实现有多种方式,不应局限于三层,四层,也可能是两层,五层,六层,具体以实际的项目为准。

本文希望由浅入深的介绍分层相关的知识,使大家不仅知道分层,还知道为什么分,怎么分。从概念到落地是架构师必须跨过的一道坎。通过了这个坎就可以将架构知识灵活的运用到项目中,实现能力的升华,成为真正的架构师。

实际每一层还会有一些变化,不同的设计模式和架构模式实现的分层和代码的组织方式也是不同的,没有完全一样的架构,合适的就是最好的。

架构模式之分层架构总结相关推荐

  1. MyBatis学习:简单认识一下MVC架构模式和三层架构

    1.本篇博客的背景和目的 目前我本人正在学习MyBatis框架,在原先了解并且懵懵懂懂使用的基础上,开始系统正式的学习.本篇博客阐述一下MVC架构模式和三层架构,以及明晰一下我们通常在Web项目中的编 ...

  2. 软件架构模式之分层架构

    本章内容出自<软件架构模式>第一章,该书由 开发技术前线 项目组成员翻译,更多内容请访问 <软件架构模式>中文版pdf . 简介 对程序员来说很常见一种情况是在没有合理的程序架 ...

  3. FGUI+Laya Air 游戏架构之stage分层架构

    先提前说明,此架构是幼麟棋牌框架的作者@麒麟子大神教给笔者的,麒麟子大佬给了一套基于FGUI+Laya Air写的棋牌大厅界面子工程学习,奎斯花了一段时间从代码中学习并初步总结了出了分层游戏架构的基本 ...

  4. android新架构模式_Android MVIReact架构模式

    android新架构模式 If you are already aware of basic principles of architecture patterns and MVVM and MVI ...

  5. autosar中bsw架构组成_AUTOSAR分层架构深度解析

    AUTOSAR的分层式架构设计,用于支持完整的软件和硬件模块的独立性(Independence),中间RTE(Runtime Environment)作为虚拟功能总线VFB(Virtual Funct ...

  6. 【架构】软件分层架构视角图

    注:仅供参考学习,欢迎交流

  7. 软件架构模式 mark Richards - 读后总结 1 - 分层架构

    软件架构模式 Mark Richards 著 版权归 © 2015 O'Reilly Media, Inc. 所有. 原书发布链接为  Software Architecture Patterns [ ...

  8. 软件设计7种架构模式

    一.简介 架构模式是对给定上下文的软件架构中常见问题的一种通用的可复用的解决方案.一种模式就是特定上下文的问题的一种解决方案. 大体上,主要有下面这7种架构模式: 分层架构 多层架构 管道/过滤器架构 ...

  9. 这 3 种 DDD 分层架构的模式,你掌握了么?

    -     前言    - 在讨论DDD分层架构的模式之前,我们先一起回顾一下DDD和分层架构的相关知识. -     DDD 的基本概念     - DDD(Domain DrivenDesign, ...

最新文章

  1. C# 创建Windows服务
  2. React开发(248):react项目理解 ant design input autosize
  3. STM32的位带操作
  4. html中多个网页的跳转页面,Html --- Footer 多页面应用跳转
  5. 机器学习笔记 - 什么是图神经网络?
  6. STM8S003F3 开发环境搭建
  7. Hexo 搭建个人博客(九)NexT 主题进阶配置
  8. 深度学习论文: Avoiding Overfitting: A Survey on Regularization Methods for Convolutional Neural Networks
  9. 《具体数学》部分习题解答4
  10. 趋势交易法之区间跨度
  11. 【前端必备项目】品优购商城前端
  12. c++ 构造函数+初始化列表
  13. 模态振型的一些概念解释
  14. BZOJ1707:[Usaco2007 Nov]tanning分配防晒霜
  15. 【20211127】【Python】Python中常用的矩阵操作,单位阵、对角阵、矩阵的特征值和特征向量、矩阵的协方差
  16. android ratingbar 高度,Android RatingBar终极解决方案,大小、颜色、间距、样式随便定义...
  17. 大学生月老系统2.0
  18. [附源码]Python计算机毕业设计SSM基于Web课堂签到管理系统(程序+LW)
  19. Edrawing免费下载
  20. 腾讯拟推出个人微信云存储付费服务,你会买单吗?

热门文章

  1. vue学习之VueRouter 路由
  2. axios封装 —— 数据缓存、防止重复请求、动态加载
  3. frida-dexdump Frida 脱壳
  4. 关于最近一篇 别再盯着我们看了 92年女生致周鸿祎公开信事件,我想说点什么!
  5. wireshark数据分析-Bravo-1
  6. 周鸿祎:把自己当成打工的,一辈子都是打工的!
  7. python网络编程arp_python网络编程学习笔记(四):域名系统
  8. redhat 系统信息查看命令大全
  9. 手机端调取相册拍照压缩上传到阿里云2
  10. [ActionScript3.0] AS3利用ExternalInterface与js通信