Skip to content

Commit

Permalink
Merge pull request #425 from marszhangzhixing/patch-8
Browse files Browse the repository at this point in the history
Update 2020-06-02-重学 Java 设计模式《适配器模式》.md
  • Loading branch information
fuzhengwei authored May 28, 2024
2 parents ce11e40 + 9784146 commit 6cb7994
Showing 1 changed file with 9 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ lock: need

`框架中用到了设计模式吗?`

框架中不仅用到设计模式还用了很多,而且有些时候根本不是一个模式的单独使用,而是多种设计模式的综合运用。与大部分小伙伴平时开发的CRUD可就不一样了,如果都是if语句从上到下,也就算得不上什么框架了。就像你到Spring的源码中搜关键字`Adapter`,就会出现很多实现类,例如`UserCredentialsDataSourceAdapter`。而这种设计模式就是我们本文要介绍的适配器模式。
框架中不仅用到设计模式还用了很多,而且有些时候根本不是一个模式的单独使用,而是多种设计模式的综合运用。与大部分小伙伴平时开发的CRUD可就不一样了,如果都是if语句从上到下,也就算得不上什么框架了。就像你到Spring的源码中搜关键字`Adapter`,就会出现很多实现类,例如 `UserCredentialsDataSourceAdapter`。而这种设计模式就是我们本文要介绍的适配器模式。

`适配器在生活里随处可见`

Expand Down Expand Up @@ -65,7 +65,7 @@ lock: need

随着公司的业务的不断发展,当基础的系统逐步成型以后。业务运营就需要开始做用户的拉新和促活,从而保障`DAU`的增速以及最终`ROI`转换。

而这时候就会需要做一些营销系统,大部分常见的都是裂变、拉客,例如你邀请一个用户开户、或者邀请一个用户下单,那么平台就会给你返利,多邀多得。同时随着拉新的量越来越多开始设置每月下单都会给首单奖励,等等,各种营销场景。
而这时候就会需要做一些营销系统,大部分常见的都是裂变、拉客,例如你邀请一个用户开户、或者邀请一个用户下单,那么平台就会给你返利,多邀多得。同时随着拉新的量越来越多开始设置每月下单都会给首单奖励,等等,各种营销场景。

那么这个时候做这样一个系统就会接收各种各样的MQ消息或者接口,如果一个个的去开发,就会耗费很大的成本,同时对于后期的拓展也有一定的难度。此时就会希望有一个系统可以配置一下就把外部的MQ接入进行,这些MQ就像上面提到的可能是一些注册开户消息、商品下单消息等等。

Expand Down Expand Up @@ -234,17 +234,17 @@ itstack-demo-design-6-02
├── impl
│ ├── InsideOrderService.java
│ └── POPOrderAdapterServiceImpl.java
├── MQAdapter,java
├── OrderAdapterService,java
└── RebateInfo,java
├── MQAdapter.java
├── OrderAdapterService.java
└── RebateInfo.java
```


**适配器模型结构**

![适配器模型结构](https://bugstack.cn/assets/images/2020/itstack-demo-design-6-04.png)

- 这里包括了两个类型的适配接口适配、MQ适配。之所以不只是模拟接口适配,因为很多时候大家都很常见了,所以把适配的思想换一下到MQ消息体上,增加大家多设计模式的认知。
- 这里包括了两个类型的适配接口适配、MQ适配。之所以不只是模拟接口适配,因为很多时候大家都很常见了,所以把适配的思想换一下到MQ消息体上,增加大家多设计模式的认知。
- **先是做MQ适配**,接收各种各样的MQ消息。当业务发展的很快,需要对下单用户首单才给奖励,在这样的场景下再增加对**接口的适配**操作。

### 2. 代码实现(MQ消息适配)
Expand Down Expand Up @@ -287,7 +287,7 @@ public class MQAdapter {
}
```

- 这个类里的方法非常重要,主要用于把不同类型MQ种的各种属性,映射成我们需要的属性并返回。就像一个属性中有`用户ID;uId`,映射到我们需要的`userId`,做统一处理。
- 这个类里的方法非常重要,主要用于把不同类型MQ种的各种属性,映射成我们需要的属性并返回。就像一个属性中有`用户ID;uId`,映射到我们需要的 `userId`,做统一处理。
- 而在这个处理过程中需要把映射管理传递给`Map<String, String> link`,也就是准确的描述了,当前MQ中某个属性名称,映射为我们的某个属性名称。
- 最终因为我们接收到的`mq`消息基本都是`json`格式,可以转换为MAP结构。最后使用反射调用的方式给我们的类型赋值。

Expand Down Expand Up @@ -333,7 +333,7 @@ public void test_MQAdapter() throws NoSuchMethodException, IllegalAccessExceptio
```

- 在这里我们分别模拟传入了两个不同的MQ消息,并设置字段的映射关系。
- 等真的业务场景开发中,就可以配这种映射配置关系交给配置文件或者数据库后台配置,减少编码。
- 等真的业务场景开发中,就可以把这种映射配置关系交给配置文件或者数据库后台配置,减少编码。

##### 2.3.2 测试结果

Expand All @@ -356,7 +356,7 @@ Process finished with exit code 0

因为增加了只有首单用户才给奖励,也就是你一年或者新人或者一个月的第一单才给你奖励,而不是你之前每一次下单都给奖励。

那么就需要对此种方式进行限制,而此时MQ中并没有判断首单的属性。只能通过接口进行查询,而拿到的接口如下
那么就需要对此种方式进行限制,而此时MQ中并没有判断首单的属性。只能通过接口进行查询,而拿到的接口如下

| 接口 | 描述 |
| ------------------------------------------------------------ | ------------------------- |
Expand Down

0 comments on commit 6cb7994

Please sign in to comment.