企业应用架构模式学习笔记 2008-1-27
第一部分 表述 1 分层
1.1 三个基本层次
三层架构: 表现层:表现逻辑处理用户与软件间的交互。主要职责是:
ü 向用户显示信息
ü 把从用户那里获得的信息解释成领域层或数据源层上的各种动作。
数据源层:数据源逻辑主要关注与其他系统的交互,这些系统将代表应邀完成相关的任务。主要的数据源逻辑就是数据库,它的主要职责是存储持久数据。
领域层:领域逻辑(业务逻辑),它就是应用必须做的所有领域相关的工作:
ü 根据输入数据或已有数据进行计算
ü 对从表现层输入的数据进行验证
ü 根据从表现层接收的命令来确定应该调度哪些数据源逻辑。
三层的关系:领域层是核心!表现层是系统对外提供服务的外部接口;数据源层是系统使用外部服务的接口。
零雨其蒙批注:这段话实在是经典,表现层作为对外提供服务的接口,指明了外部如何使用该系统的契约,这样领域层可以作为Web Service暴露给外部,可以是REST风格的服务接口,抑或作为另一个系统的数据源。而数据源层作为领域层访问外部服务的接口,指明了该系统如何使用其它服务的契约,这些服务就可能是数据库服务,消息服务,甚至是另一个可以提供数据的系统,我想这层之下的层次叫做EIS的原因吧。 这也恰恰提醒我们,表现层接口和数据源层(我还是觉得叫数据访问层比较好)接口并不直接相关,因此在设计时不要将这两个接口进行简单的设计映射,表现层接口的契约与数据源层接口的契约简单对应会造成系统不稳定,数据访问层的变动将导致表现层接口的变动。另外,由于要记住,它们是为不同目的设计的!
分层结构依赖原则:领域层和数据源层绝对不要依赖于表现层。也就是说,在领域层和数据源层的代码中,不要出现调用表现层代码的情况。
区分逻辑层次的是否划分正确的简单测试原则:层次替换修改原则(注:我自己给起的名字)——假想向系统中增加一个完全不同的新层,例如为Web应用增加一个命令行界面层。如果这个过程中,发现需要重复实现某些功能,则说明可能有一些本应该在领域层实现的逻辑,现在在表现层实现了。类似的,你可以假想一下,将后台数据库更换成XML文件格式,看看情况又如何?
2 组织领域逻辑
事务脚本模式与领域模型模式。
范例:
核心问题是:对于同一给定的合同,不同种类的产品有不同的收入确认算法。计算收入确认的方法中必须先确定给定合同中产品的种类,然后应用正确的算法,之后再创建相应的收入确认对象(RevenueRecognition)来保存计算结果。
使用事务脚本计算收入确认
a Recognition Service:确认服务
calculateRecognitions(contractID):根据合同(contract)ID计算确认
findContract(contractID):向数据入口发送“查找合同”消息,根据合同ID查找合同,返回合同结果集
insert revenue recognitions:插入收入确认。
使用领域模型计算收入确认
利用了典型的策略模式(GoF),将对于不同产品的确认策略分离出来,以实现对于不同产品采取不同的计算确认策略。
class Contract{
private Product product;
public void setProduct(Product product){
this. product= product;
}
public Product getProduct(){
return this. product;
}
public void calculateRecogntions(){
getProduct().calculateRecogntions(this);
}
}
class Product{
private RecogntionStrategy recogntionStrategy;
public void set RecogntionStrategy (RecogntionStrategy recogntionStrategy){
this. recogntionStrategy = recogntionStrategy;
}
public RecogntionStrategy getRecogntionStrategy (){
return this. recogntionStrategy;
}
public void calculateRecogntions(Contract contract){
getRecogntionStrategy ().calculateRecogntions (contract);
}
}
2.1 服务层
概念:处理领域逻辑的常见方法是将领域层再细分成两层。服务层独立出来,置于底层的领域模型或表模块之上。
职责:表现逻辑与领域层的交互完全通过服务层,就好像应用程序的API一样。服务层是放置事务控制和安全等功能的好场所。
组成:最小化情况下,服务层只是一个外观,所有实际的行为都在下层的对象中,服务层所做的只是将上层调用传递到更低层。此时,服务层提供一个更易于使用的API,因为它的方法通常根据用例来组织。该方式是Fowler最为推崇的方式。另外还有将服务层实现为一个事务脚本或使用控制器-实体模式。
3 映射到关系数据库
3.1 架构模式
讲了几种入口(Gateway)模式后,Fowler指出:一种更好的方法是把领域模型和数据库完全独立,可以让间接层完成领域对象和数据库表之间的映射。这个数据映射器处理数据库和领域模型之间所有的存取操作,并且允许双方都能独立变化。
零雨其蒙注解:目前采用Hiberante之类的O/RM框架就是实现该模式。
另外,Fowler不推荐把入口(Gateway)用作领域模型的首选持久化机制。
即使使用数据映射器作为首选持久化机制,还是可以使用数据入口来封装被视为外部接口的表或者服务。
分享到:
相关推荐
然而,在推进云教室建设与共享应用模式的过程中,如何有效利用云教室提升远程教育教学水平、促进优质教育资源共享以及提高人才培养的质量和数量,仍需教育工作者、技术开发者和政策制定者共同努力探索和研究。
这份名为“安卓笔记——安卓详细笔记汇总”的资源,无疑是安卓开发者或者学习者的重要参考资料。以下将对这个压缩包中可能包含的知识点进行深入解析。 首先,Android系统是基于Linux内核的开源操作系统,广泛应用于...
本课程笔记主要涵盖了软件架构的重要概念、设计模式、评估标准以及实际应用,旨在帮助学习者深入理解并掌握软件架构设计的核心知识。 一、软件体系结构基本概念 软件体系结构是软件系统的高级构造,它描述了系统的...
《MLDN——Java Web开发实战经典源码笔记(基础篇)》是一本专注于Java Web开发的实战教程,旨在帮助读者从零开始掌握Web应用的开发技术。这本书通过深入浅出的讲解和丰富的实例代码,全面介绍了Java Web开发的基础...
在Web技术的发展部分,可能涉及HTTP协议的演变、Web应用程序的架构模式以及动态网页技术如PHP、ASP、JSP等。在Tomcat配置部分,可能详细讲解了如何安装Tomcat,如何在Windows、Linux等不同操作系统上启动和停止...
Oracle9i备课笔记——吕海东 第1讲 Oracle9i简介 目的: 1. 了解数据库的发展,关系数据库的基本原理。 2. 了解目前市场上流行的数据库产品及特点 3. 了解Oracle数据库的发展 4. 掌握Oracle9i产品系列 5. 掌握Oracle...
【描述】"IOS应用源码——Notebook(记事本).zip" 提示我们,这个源码实现了一个基本的记事本功能,可能包括创建、编辑、保存和查看笔记。通过分析和学习这个源码,开发者可以了解到iOS应用的基本架构,以及如何...
《入门嵌入式的好资料——ARM学习笔记》是一份由湖北汽车工业学院的曾生伟撰写的宝贵资源,旨在帮助初学者掌握ARM架构的核心概念和编程技巧。这份笔记不仅涵盖了ARM架构的基础知识,还深入探讨了关键组件的工作原理...
MVC设计模式是软件工程中的一种架构模式,它将应用程序分为三个核心部分:模型(Model)、视图(View)和控制器(Controller)。这种分离使得开发过程更加模块化,降低了复杂性,提高了代码的可维护性和可重用性。 ...
1. **J2EE研究文集.chm**:这个文件专注于Java企业级应用开发,涵盖J2EE(Java 2 Platform, Enterprise Edition)的相关技术,包括Servlet、JSP、EJB、JMS、JPA等,对于理解Web应用程序的后端架构和开发流程极其有...
"IOS应用源码——iPad记事本.zip"提供了一个适用于iPad的记事本应用的完整源代码,这对于iOS开发者,尤其是初学者来说,是一个非常宝贵的资源。接下来,我们将深入探讨这个项目中涉及的一些关键知识点。 1. **Swift...
【Spring Cloud微服务架构笔记(四)】 在微服务架构中,Spring Cloud Stream是一个关键组件,它为企业级开发提供了一种高效、灵活的消息处理机制。本文将深入探讨Spring Cloud Stream的功能、核心概念以及如何在...
Oracle Application Framework (OAF) 是Oracle E-Business Suite (EBS) 的一个重要组成部分,它提供了一个用于构建企业级应用的框架。这篇重新整理后的“Oracle OAF学习笔记”旨在帮助开发者深入理解并熟练掌握OAF的...
【标题】"IOS应用源码——ProjectPaper-ProjectPaper-e6d276f.rar" 指的是一份iOS应用程序的源代码压缩包,其中包含的版本标识为e6d276f,这通常代表了源代码的某个特定Git版本。在iOS开发中,源代码是构建应用程序...
与IPv4的DHCP不同,DHCPv6有多种操作模式,包括无状态自动配置(Stateless Address Autoconfiguration, SLAAC)和状态ful配置,以适应IPv6的大规模地址分配需求。 服务器双归冗余架构则关注的是服务器的高可用性。...
在Redis源码阅读笔记(10)——事件中,我们将探讨Redis如何利用事件模型来实现非阻塞I/O,以及相关的编程模型如Reactor模式和NIO。 Redis使用了一个基于epoll的事件处理器,epoll是Linux系统提供的一种高效I/O多路...
本文将基于私塾在线《Hadoop实战——初级部分》的学习笔记,深入探讨Hadoop的基本概念、核心组件以及在实际中的应用。 #### 二、为何选择学习Hadoop 1. **市场需求**:当前社会产生了大量的数据,例如每分钟...
它提供了服务器端的编程模型,包括Servlet、JavaServer Pages (JSP)、JavaBeans、EJB (Enterprise JavaBeans)等技术,支持分布式计算和多层架构的应用程序开发。 Servlet是J2EE中一个核心组件,它是运行在服务器端...
3. **MVC(Model-View-Controller)架构模式**:在JavaWeb开发中,MVC模式被广泛采用,用于组织和管理应用程序结构。Model代表业务数据,View负责展示,Controller处理用户请求并协调Model和View。 4. **JSTL(Java...
总之,通过阅读和理解这篇“Android Training学习笔记——Navigation 参考源码(ListView版)”,开发者可以获得关于如何在Android应用中创建基于ListView的导航系统的宝贵经验。源码分析将加深对Navigation组件和...