企业架构模式——分层

本文介绍了分层设计的基本概念,探讨了其在计算机体系结构中的应用,例如存储器层次结构和TCP/IP协议栈,并分析了分层设计的优点和局限性。此外,还详细描述了一个典型的三层架构:表现层、领域层和数据源层。

一、分层设计的基本概念

在分解复杂的软件系统时,软件设计者用的最多的技术之一就是分层。在计算机体系机构中,可以看到,到处都有分层的例子,最为典型的,就是存储器的层次结构,如图所示:

存储器的层次结构

图1:计算机存储器的层次模型

可以看到,存储器的层次结构是按访问速度、存储容量等参数划分的,不同的层次有不同的职责。CPU内部的寄存器组是访问速度最快的存储设备,用于存储CPU运算过程中的指令和数据;主存中存储的的则是执行中程序(进程)需要的代码和数据。由于CPU访问主存的速度很慢,因此引入了高速缓存处理器(高速缓存),用于缓解CPU访问寄存器和主存的速度差异。同样,计算机网络中的TCP/IP协议栈也把层次性的设计思维体现的淋漓尽致:

TCP

图2:TCP/IP协议栈的五层模型

在层次结构中,上层模块依赖于下层模块,下层模块为上层模块提供服务,在代码中体现,就是上层可以调用下层提供的公共方法。比如应用层协议FTP架构在传输层TCP之上、TCP架构在互联网层协议IP之上。

当用分层的观点来考虑系统时,可以将各个子系统想象成“多层蛋糕”的形式,每一次都依托在其下层之上。在这种组织方式下,上层使用了下层定义的各种服务,而下层对上层一无所知。另外,每一层都对自己的上层隐藏其下层的细节。因此,第3层使用第2层提供的服务,第2层使用第1层提供的服务,第3层无需知道第1层的细节(当然,并非所有的分层架构都这么隔绝)。

将系统按照层次分解有很多好处:

①在无需了解其他层次的基础上,可以将某一层作为一个整体来理解

②可以很容易替换某层的实现,只要其前后提供的服务(接口)相同即可

③可以将层次间的依赖性减到最低

④一旦构建好了某一层,就可以用它为很多上层服务提供支持。比如,TCP可以同时被telnet、FTP和HTTP使用

分层式一种重要的技术,但也有缺陷

①层次有时会带来级联修改

②层次提供了一种间接性,因此过多的层次会影响性能

当人们讨论分层时,常常不容易区分layer和tier。这两个词汇经常被用作同义词,但是很多人还是认为tier意味着物理上的分离。客户/服务器系统常常被称为“two-tier system”,其分离是物理上的分离:客户端是一台台式机,而服务器端则运行在在另一个地方的服务器。layer强调无需把不同的层次放在不同的计算机上运行。

二、三个基本层次

层次职责
表现层与用户交互的接口
领域层(业务层)业务逻辑,系统的核心
数据源层与数据库、消息系统及其他软件包通讯

表现层:处理用户与软件的交互

领域层:也称为业务层,它完成领域相关的工作:包括根据输入数据或已有数据进行计算、对从表现层输入的数据进行验证,以及根据从表现层接受到的命令来确定应该调度哪个数据源逻辑。

数据源层:主要关注与其他系统的交互。比如数据库、消息系统等。

在某些小型系统中,表现层跨过了领域层而直接去和数据源层交互,实践证明这样也可以工作很好,不过这样的系统的业务逻辑都很简单。

三、参考资料

1、企业架构模式    Martin Flower  

[附:Android平台架构图、金山卫士产品架构图]

Android系统架构                        金山卫士产品架构图

 

在微信小程序中,处理 HTML 实体(如 ` `、`&mdash;` 等)通常需要手动进行字符串替换,因为小程序的框架并不支持直接渲染 HTML 内容。开发者可以通过 WXML 和 WXSS 来实现类似 HTML 的排版效果。 ### 使用字符串替换处理 HTML 实体 可以使用 JavaScript 的字符串替换方法,将常见的 HTML 实体替换为对应的 Unicode 字符。例如: ```javascript const entityMap = { ' ': '\u00A0', // 空格 '&mdash;': '\u2014', // 破折号 '<': '<', '>': '>', '&': '&', // 可以继续添加其他实体 }; function decodeHtmlEntities(str) { return str.replace(/&[a-zA-Z0-9#]+;/g, (entity) => { return entityMap[entity] || entity; }); } ``` 在 WXML 中,可以直接使用该函数处理文本内容: ```wxml <view>{{ decodedText }}</view> ``` 在 JS 中: ```javascript Page({ data: { decodedText: decodeHtmlEntities('Hello World&mdash;Welcome') } }); ``` ### 使用 RichText 组件渲染富文本 如果确实需要渲染富文本内容,可以使用 `<rich-text>` 组件。它支持部分 HTML 标签和内联样式,但不完全等同于浏览器的 HTML 渲染能力。例如: ```wxml <rich-text nodes="{{ nodes }}"></rich-text> ``` 在 JS 中定义 `nodes`: ```javascript Page({ data: { nodes: [{ name: 'text', text: 'Hello\u00A0World\u2014Welcome' }] } }); ``` 如果希望直接使用 HTML 字符串,可以将其转换为节点数组: ```javascript function htmlToNodes(html) { const parser = new DOMParser(); const doc = parser.parseFromString(html, 'text/html'); const nodes = []; function traverse(node) { if (node.nodeType === 3) { // 文本节点 nodes.push({ name: 'text', text: node.textContent }); } else if (node.nodeType === 1) { // 元素节点 const children = []; for (let i = 0; i < node.childNodes.length; i++) { traverse(node.childNodes[i]); } nodes.push({ name: node.tagName.toLowerCase(), attrs: {}, children: children }); } } traverse(doc.body); return nodes; } ``` ### 使用 WXSS 处理空格和特殊字符 如果只是需要简单的排版效果,可以使用 WXSS 中的 `white-space` 属性来控制空格和换行行为: ```wxml <view class="preserve-space">Hello World Welcome</view> ``` ```css .preserve-space { white-space: pre; /* 保留空格和换行 */ } ``` 通过这种方式,可以避免使用 ` `,而是直接使用普通空格字符。 ### 总结 微信小程序中处理 HTML 实体可以通过字符串替换、`<rich-text>` 组件或直接使用 WXSS 的 `white-space` 属性来实现。具体选择哪种方式取决于应用场景和需求。对于简单的文本处理,字符串替换和 WXSS 是更轻量级的选择;而对于复杂的富文本内容,`<rich-text>` 组件则更为合适[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值