接下来这篇文章我们将要谈谈《 Patterns of Enterprise Application Architecture - Martin Fowler 》这本书中的 DISTRIBUTION PATTERNS 中的 『 Remote Facade 』。
Provides a coarse-grained facade on fine-grained objects to improve efficiency over a network.
然後下面这句是从另一篇文章看到的,我觉得也不错,就在这记录一下。
Remote facade is intended for minimizing the number of remote calls in an application
在 《 Patterns of Enterprise Application Architecture - Martin Fowler 》这本书中有一个最简单的例子,如下图,基本上就是一个 facade 来让外部使用简单化,
而在 nodejs 我个人觉得也有这种用法 :
// 假设这三个方法都是非同步的 i/o 操作
moduel.exports = {
getCity,
getState,
getZip
}
// Remote Facade
async function getAddressRemoteFacade(){
const [city, state, zip] = await Promise.all([
getCity,getState,getZip
]);
return { city, state, zip }
}
// Application
const address = await getAddressRemoteFacade()
这里我们有假设一件事情,那就是取得到 address 的相关方法,就只有提供 getCity、getState、getZip,如果 remote 本身就有提到取得完整的 getAddress 那就当然不需要,别忘了 facade 的目的 :
facade 的设计是为了让外部使用简单化,而不是为了简单化内部系统。
然後根据书中,有几个重要事项需要注意 :
这个范例中事实上有多提到两个东西 :
// Domain
class PersonAddressDomain{
userId: string
city: string
country: string
}
class PersonDomain{
id: string
name: string
age: number
}
// Remote Facade
class PersonDTO{
id: string
name: string
age: number
address: PersonAddressDomain
}
class PersonAssembler{
writeDTO(person: PersonDomain, address: PersonAddressDomain): PersonDTO{
const result = new PersonDTO()
result.id = person.id
result.name = person.name
result.age = person.age
result.address = address
return result
}
}
// Service
class PersonService{
assembler: PersonAssembler
constructor(personAssembler: PersonAssembler){
this.assembler = personAssembler
}
getPerson(id: string): PersonDTO{
const person: PersonDomain = personRepository.getById(id)
const address: PersonAddressDomain = personAddressRepository.getByUserId(id)
const result: PersonDTO = this.assembler.writeDTO(person, address)
return result
}
}
在实务上事实上有很多时後的输出,与 domain 事实上不相同,你也可以想成画面要的东西事实上和 domain 不太一样,而这时 remote facade 会处理两件事情 :
基本上这东西可以解释 Presentation Layer 与 Domain Layer 之间形状不一致的方法。
设计模式中的『 Facade 』。
PHP Laravel 的 Facade 的理解 - marklin
remote facade 与 facade 本身是否相同我还不确定,但至少我觉得 Martin 所提的 remote facade 本质上是以分层来思考的,而它将它放的位置就在於 presentation layer 与 domain layer 之间。
<<: Re: 新手让网页 act 起来: Day22 - React Hooks 之 useCallback
>>: 创建App-Google sign in my App
在Day21时,尝试讲解内建Skybox Shader是怎麽写的,後来踩到了一些坑,里面就碰到几个我...
从源头降低风险(X),可归究责任(O) 适用人员: 技术人员(开发人员)。 适用法规: 资通安全责任...
前情提要 昨天我们成功的让 App 在本机端运作,但按下 开始预测! 後却出现了错误: 这意味着虽然...
前言 昨天讲了在产生 session ID 时有什麽应该要注意的地方,但除了 session 之外,...
今天的题目是要我们在一个整数阵列中找到子阵列(subarray),也就是撷取阵列中相连的一部分,求出...