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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏互联网杂技

Nodejs学习路线图

Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的w...

1.2K80
来自专栏Python数据科学

Python定期爬取GitHub上每日流行项目

介绍一个在GitHub上看到的通用的python爬虫,难度不大,是一个蛮好玩的点,顺便总结一下python爬虫的一些需要注意的点。

28320
来自专栏施炯的IoT开发专栏

微软移动 Nokia Lumia SensorCore SDK 介绍及上手体验

    早在今年的BUILD大会上,诺基亚就宣布了SensorCore以及它的部分演示。今天,它终于面世了,大家可以去Building Apps for Win...

28570
来自专栏进击的程序猿

orm 系列 之 Eloquent演化历程2

上篇讲到了数据库Relation的实现,本篇接着讲migrations or database modification logic的功能,此处开始的git是g...

9430
来自专栏小樱的经验随笔

BugkuCTF web基础$_GET

前言 写了这么久的web题,算是把它基础部分都刷完了一遍,以下的几天将持续更新BugkuCTF WEB部分的题解,为了不影响阅读,所以每道题的题解都以单独一篇文...

333100
来自专栏贾老师の博客

分布式系统的接口幂等性设计

32830
来自专栏Android相关

X86处理器架构--Nehalem

最开始的处理器比较简单,8086处理器是评估当前的指令指针(CS:IP)指向的指令,然后再执行解码、执行、退出,并移动指令指针到下一个位置,每一个新的芯片都做了...

15240
来自专栏Java后端技术栈

【面试题】2018年最全Java面试通关秘籍第五套!

注:本文是从众多面试者的面试经验中整理而来,其中不少是本人出的一些题目,网络资源众多,如有雷同,纯属巧合!禁止一切形式的碰瓷行为!未经允许禁止一切形式的转载和复...

18410
来自专栏Android群英传

实现 APK 保护时常见的坑和解决方案

11530
来自专栏LET

CPU Cache简介

真空中光速为299,792,458米/秒,目前,Intel的i7频率可以达到4GHz,简单换算一下,可以得出结论:光(电流)在一个Cycle内移动的距离约为0....

23820

扫码关注云+社区

领取腾讯云代金券