企业模式和设计模式快速入门

时间:2022-04-24
本文章向大家介绍企业模式和设计模式快速入门,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

相信大家对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. 

参考资料

  1. Scott, Hanselman. ASP.NET设计模式[M]. 北京:清华大学出版社, 2013.
  2. Eric, Evans. 领域驱动设计[M]. 北京:人民邮电出版社, 2012.