From 81bd59d1107629cf9f0381c617d1fc55306dd731 Mon Sep 17 00:00:00 2001 From: Xargin Date: Sun, 24 Jun 2018 14:24:28 +0800 Subject: [PATCH] finish if --- SUMMARY.md | 1 + ch5-web/ch5-08-interface-and-web.md | 2 +- images/ch6-interface-impl.plantuml | 34 ++++++++++++++++++++++++++++ images/ch6-interface-impl.png | Bin 0 -> 15244 bytes 4 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 images/ch6-interface-impl.plantuml create mode 100644 images/ch6-interface-impl.png diff --git a/SUMMARY.md b/SUMMARY.md index 001a7b9..59f0207 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -48,6 +48,7 @@ * [5.5. Database和数据库打交道](ch5-web/ch5-05-database.md) * [5.6. Ratelimit 服务流量限制](ch5-web/ch5-06-ratelimit.md) * [5.7. Layout大型web项目分层](ch5-web/ch5-07-layout-of-web-project.md) + * [5.8. interface 和 table-driven 开发](ch5-web/ch5-08-interface-and-web.md) * [5.9. 灰度发布和 A/B test](ch5-web/ch5-09-gated-launch.md) * [5.11. Load-balance负载均衡](ch5-web/ch5-11-load-balance.md) * [第六章 分布式系统](ch6-cloud/readme.md) diff --git a/ch5-web/ch5-08-interface-and-web.md b/ch5-web/ch5-08-interface-and-web.md index a519acb..0c5c2c1 100644 --- a/ch5-web/ch5-08-interface-and-web.md +++ b/ch5-web/ch5-08-interface-and-web.md @@ -78,7 +78,7 @@ type OrderCreator interface { 如果我们正在做的是平台系统,需要由平台来定义统一的业务流程和业务规范,那么基于 interface 的抽象就是有意义的。举个例子: -TODO,interface 实现的 uml 图 +![interface-impl](../images/ch6-interface-impl.png) 平台需要服务多条业务线,但数据定义需要统一,所以希望都能走平台定义的流程。作为平台方,我们可以定义一套类似上文的 interface,然后要求接入方的业务必须将这些 interface 都实现。如果 interface 中有其不需要的步骤,那么只要返回 nil,或者忽略就好。 diff --git a/images/ch6-interface-impl.plantuml b/images/ch6-interface-impl.plantuml new file mode 100644 index 0000000..3a80f62 --- /dev/null +++ b/images/ch6-interface-impl.plantuml @@ -0,0 +1,34 @@ +@startuml interface-impl + +interface OrderCreator + +OrderCreator <|-- O2OOrderCreator +OrderCreator <|-- B2BOrderCreator + +interface OrderCreator { + ValidateDistrict() + ValidateVIPProduct() + GetUserInfo() + GetProductDesc() + DecrementStorage() + CreateOrderSnapshot() +} + +class O2OOrderCreator { + ValidateDistrict() + ValidateVIPProduct() + GetUserInfo() + GetProductDesc() + DecrementStorage() + CreateOrderSnapshot() +} + +class B2BOrderCreator { + ValidateDistrict() + ValidateVIPProduct() + GetUserInfo() + GetProductDesc() + DecrementStorage() + CreateOrderSnapshot() +} +@enduml \ No newline at end of file diff --git a/images/ch6-interface-impl.png b/images/ch6-interface-impl.png new file mode 100644 index 0000000000000000000000000000000000000000..8b3a367e1b616eb5d74a239939943b4aafb1dc81 GIT binary patch literal 15244 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 literal 0 HcmV?d00001