企业模式和设计模式快速入门
相信大家对GOF的23个设计模式和Martin Fowler的企业应用架构模式都有过了解,这部分的内容和知识非常驳杂,不过真正常用的模式并不多,比如单例模式、策略模式、适配器模式等。本文将通过项目实践,分层次的介绍相关模式的应用,可以通过下图对主题结构有所了解,其中A表示设计模式、B表示企业架构应用模式,标红部分表示必须熟练掌握内容。
文中涉及的模式的代码请见:https://github.com/wanliwang/Bjork.Framework/tree/master/Bjork.Framework.Pattern
企业模式:
Repository模式,类似一个内存集合,将业务实体与底层数据基础设施完全隔离出来;
DAO模式,用于将DAL元素从应用程序中分离出来,与Repository模式相似,但其未隐藏接口背后的数据表,适合轻量级DAL封装;
Unit of Work工作单元模式,用于维护一个由已经被业务事务修改的业务对象组成的列表,需要用到marker interface标记模式,不算特别实用;
这部分比较重要的模式就是optimistic lock乐观锁,其实现比较简单就是增加versionID字段," Update Order SET Status = 1, VersionID = VersionID + 1 WHERE ID = @id AND VersionID = @versionID "。
Lazy Loading延迟加载模式,它把资源的加载工作推迟到真正需要的时候,Martin Fowler称其为"一个并没有包含所有需要的数据但知道如何获取这些数据的对象"。
Identity Map模式,通过将所有已加载对象放在一个映射中确保所有对象只被加载一次,并再需要时从映射中获取,其实就是我们常见的缓存,用Dictionary字典实现,在CS盛行的时代,这个非常常见。
Query Object模式:实际上LINQ就是该模式的一个实现,涉及操作数、操作符,将程序语言翻译为SQL语言,比较复杂,学会使用和思路就足够了。
设计模式:Proxy代理模式,其充当另一个对象的代理人,使得代理能够控制对该对象的访问并且可以添加与该操作相关的额外操作。
- Service服务层
对于企业内部来说,服务层的常见架构就是SOA,其4项基本原则是边界明确、服务自治、服务共享数据模式和契约、基于策略确定服务兼容性。
设计模式:Facade,简化一个复杂子系统或一组子系统的接口,为客户提供一个简单的API,一般用于Legacy遗留系统的整合;
企业模式:Message模式,其涉及Request&Response、Reservation、Idempotent3个子模式,请求响应没什么好说的,Reservation就是通常我们在服务中定义的ReferenceID流水号,用一唯一标识该服务请求,而Idempotent幂等模式用于保证多次调用同一服务不会带来副作用,可以用数据库的建立一张幂等表来实现,也就是服务的幂等性的概念,非常常见和重要。
- BLL业务逻辑层
设计模式:工厂方法主要用于根据输入动态的创建类;Decorate模式,简单来说就是方法的组合;Template Method模板方法常用于在项目提取方法的共同部分,便于重用;State模式用于减少if-else的使用,当然需要增加很多代码,但已于理解和维护;Strategy策略模式,实际就是多态性的应用;Composite组合模式,可以动态的组合成树状或层次结构集合并加以使用,就像单个对象一样。
企业模式:Specification模式,用于把布尔运算中的业务逻辑封装到业务实体之外,然后可以把这些可管理的逻辑单元链接起来,形成更灵活的复杂业务逻辑(可以和组合模式结合使用)。
- UI展示层
这部分的内容的核心就是Ajax,将要介绍的模式都是基于Ajax的,用于解决其痛点。主要模式包括以下3个:Periodic Refresh定时刷新和Timeout超时;Unique URL模式维护历史记录;Predictive Fetch预加载。
- UI逻辑层
企业模式:Service Locator服务定位,其充当一个集中化的服务资源库,它有一个简单的接口用于获取服务,可以视为一个加强型的工厂;常见的页面展示的模式包括MVC、MVP、FrontController、PageContoller等,当前最常用的是MVC和MVVM(ViewModel)。
设计模式:Command命令模式,用于定义一个表示方法的对象,将调用该方法所需的信息都封装起来;Chain Of Responsibility责任链模式,类似现实中的审批流程,层层提交,直到有权限处理的人为止。
Tip:
在实践中,设计模式的重要性一般不如企业应用架构模式,毕竟后者的层次更高,所以在日常代码中不用太纠结于设计模式的使用,按照20-80效应,个人认为真正需要掌握的设计模式如下所示。
Eric Evans的领域驱动设计内容比较枯燥,重点是对领域概念的理解,这儿摘取了其中几个比较重要的概念:Entity(ID唯一性)、Value Object(很类似DTO)、Service(类似方法)。
You got a dream, you gotta protect it. People can't do something themselves, they wanna tell you can't do it. If you want something, go get it. Period.
参考资料
- Scott, Hanselman. ASP.NET设计模式[M]. 北京:清华大学出版社, 2013.
- Eric, Evans. 领域驱动设计[M]. 北京:人民邮电出版社, 2012.
- [你必须知道的.Net]读书笔记--浅clone与深clone
- Python基础语法学习整理
- 通过部分感知深度卷积网络进行人脸特征点定位
- [你必须知道的.Net]读书笔记--override与new在继承中的区别
- gitlab配置邮件通知功能操作记录
- 微信小程序价值思考:手机端的CS-BS迁移
- Linq2Sql数据实体外部更新时“不能添加其键已在使用中的实体”的解决办法
- 微信小程序:字体保持大小
- 在为知笔记中使用JQuery
- 在为知笔记中使用JQuery
- Python学习笔记(1):列表元组结构
- 6步创建一个通用机器学习模板
- Python学习笔记(2):数据库访问
- 学习Python语言,这些酷毙的工具你知道几个?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- pytest 测试框架学习(9):pytest.main
- 深入了解ActiveMQ!
- 完美解决 python ImportError: Failed to import any qt binding
- 爬取娱乐圈排行榜数据
- 如何解决Linux系统下pyaudio安装缺少文件问题error: portaudio.h: 没有那个文件或目录
- pytest 测试框架学习(10):pytest.param
- pytest 测试框架学习(11):pytest.raises
- Hibernate第二天:Hibernate的一级缓存、其他的API
- pytest 测试框架学习(12):pytest.deprecated_call
- Pinstaller(Python打包为exe文件
- pytest 测试框架学习(14):pytest.warns
- ImportError: /lib64/libm.so.6: version `CXXAB_1.3.8.' not found (required by /usr/local/python37/lib
- pytest 测试框架学习(15):pytest.freeze_includes
- Linux: scp文件,目录上传下载标准版
- Hibernate第三天:Hibernate的一对多配置、Hibernate的多对多的配置