Patterns of Enterprise Application Architecture
副标题:无
分类号:F270.7
ISBN:9787111143055
微信扫一扫,移动浏览光盘
简介
本书作者是当今面向对象软件开发的权威,他在一组专家级合作者的帮助下,将40多种经常出现的解决方案转化成模式,最终写成这本能够应用于任何一种企业应用平台的、关于解决方案的、不可或缺的手册。本书获得了2003年度美国软件开发杂志图书类的生产效率奖和读者选择奖。本书分为两大部分。第一部分是关于如何开发企业应用的简单介绍。第二部分是本书的主体,是关于模式的详细参考手册,每个模式都给出使用方法和实现信息,并配以详细的Java代码或C#代码示例。此外,整本书中还用了大量UML图来进一步阐明有关的概念。
本书是为致力于设计和构建企业应用的软件架构师、设计人员和编码人员而写的,同时也可作为高等院校计算机专业及软件学院相关课程的参考教材。
目录
引言 1
0.1 架构 1
0.2 企业应用 2
0.3 企业应用的种类 3
0.4 关于性能的考虑 4
0.5 模式 6
0.5.1 模式的结构 7
0.5.2 模式的局限性 9
第一部分 表 述
第1章 分层 12
1.1 企业应用中层次的演化 13
1.2 三个基本层次 14
1.3 为各层选择运行环境 15
第2章 组织领域逻辑 19
2.1 抉择 22
2.2 服务层 23
第3章 映射到关系数据库 25
3.1 架构模式 25
3.2 行为问题 28
3.3 读取数据 29
.3.4 结构映射模式 30
3.4.1 关系的映射 30
3.4.2 继承 33
3.5 建立映射 34
3.6 使用元数据 35
3.7 数据库连接 36
3.8 其他问题 38
3.9 进一步阅读 38
第4章 web表现层 39
4.1 视图模式 41
4.2 输入控制器模式 43
4.3 进一步阅读 43
第5章 并发 45
5.1 并发问题 45
5.2 执行语境 46
5.3 隔离与不变性 47
5.4 乐观并发控制和悲观并发控制 48
5.4.1 避免不一致读 49
5.4.2 死锁 49
5.5 事务 50
5.5.1 acid 51
5.5.2 事务资源 51
5.5.3 减少事务隔离以提高灵活性 52
5.5.4 业务事务和系统事务 53
5.6 离线并发控制的模式 54
5.7 应用服务器并发 55
5.8 进一步阅读 56
第6章 会话状态 57
6.1 无状态的价值 57
6.2 会话状态 58
6.3 存储会话状态的方法 59
第7章 分布策略 61
7.1 分布对象的诱惑 61
7.2 远程接口和本地接口 62
7.3 必须使用分布的情况 63
7.4 关于分布边界 64
7.5 分布接口 64
第8章 通盘考虑 67
8.1 从领域层开始 67
8.2 深入到数据源层 68
8.2.1 事务脚本的数据源 68
8.2.2 表模块的数据源 69
8.2.3 领域模型的数据源 69
8.3 表现层 69
8.4 一些关于具体技术的建议 70
8.4.1 java和j2ee 70
8.4.2 .net 71
8.4.3 存储过程 71
8.4.4 web services 72
8.5 其他分层方式 72
第二部分 模 式
第9章 领域逻辑模式 76
9.1 事务脚本(transaction script) 76
9.1.1 运行机制 76
9.1.2 使用时机 77
9.1.3 收入确认问题 78
9.1.4 例:收入确认(java) 78
9.2 领域模型(domain model) 81
9.2.1 运行机制 81
9.2.2 使用时机 83
9.2.3 进一步阅读 83
9.2.4 例:收入确认(java) 84
9.3 表模块(table module) 87
9.3.1 运行机制 88
9.3.2 使用时机 90
9.3.3 例:基于表模块的收入确认(c#) 90
9.4 服务层(service layer) 93
9.4.1 运行机制 94
9.4.2 使用时机 96
9.4.3 进一步阅读 96
9.4.4 例:收入确认(java) 96
第10章 数据源架构模式 101
10.1 表数据入口(table data gateway) 101
10.1.1 运行机制 101
10.1.2 使用时机 102
10.1.3 进一步阅读 102
10.1.4 例:人员入口(c#) 103
10.1.5 例:使用ado.net数据集(c#) 104
10.2 行数据入口(row data gateway) 106
10.2.1 运行机制 107
10.2.2 使用时机 108
10.2.3 例:人员记录(java) 108
10.2.4 例:领域对象的数据保持器(java) 111
10.3 活动记录(active record) 112
10.3.1 运行机制 112
10.3.2 使用时机 113
10.3.3 例:一个简单的person类(java) 113
10.4 数据映射器(data mapper) 115
10.4.1 运行机制 116
10.4.2 使用时机 119
10.4.3 例:一个简单的数据映射器(java) 119
10.4.4 例:分离查找方法(java) 123
10.4.5 例:创建一个空对象(java) 126
第11章 对象-关系行为模式 129
11.1 工作单元(unit of work) 129
11.1.1 运行机制 129
11.1.2 使用时机 133
11.1.3 例:使用对象注册的工作单元(java) 134
11.2 标识映射(identity map) 137
11.2.1 运行机制 137
11.2.2 使用时机 139
11.2.3 例:标识映射中的方法(java) 139
11.3 延迟加载(lazy load) 140
11.3.1 运作机制 140
11.3.2 使用时机 142
11.3.3 例:延迟初始化(java) 142
11.3.4 例:虚代理(java) 142
11.3.5 例:使用值保持器(java) 144
11.3.6 例:使用重影(c#) 144
第12章 对象-关系结构模式 151
12.1 标识域(identity field) 151
12.1.1 工作机制 151
12.1.2 使用时机 154
12.1.3 进一步阅读 154
12.1.4 例:整型键(c#) 154
12.1.5 例:使用键表(java) 155
12.1.6 例:使用组合键(java) 157
12.2 外键映射(foreign key mapping) 166
12.2.1 运行机制 167
12.2.2 使用时机 169
12.2.3 例:单值引用(java) 169
12.2.4 例:多表查询(java) 172
12.2.5 例:引用集合(c#) 173
12.3 关联表映射(association tablemapping) 175
12.3.1 运行机制 176
12.3.2 使用时机 176
12.3.3 例:雇员和技能(c#) 177
12.3.4 例:使用直接的sql(java) 179
12.3.5 例:用一次查询查多个雇员(java) 182
12.4 依赖映射(dependent mapping) 186
12.4.1 运行机制 186
12.4.2 使用时机 187
12.4.3 例:唱片和曲目(java) 188
12.5 嵌入值(embedded value) 190
12.5.1 运行机制 190
12.5.2 使用时机 190
12.5.3 进一步阅读 191
12.5.4 例:简单值对象(java) 191
12.6 序列化lob(serialized lob) 192
12.6.1 运行机制 193
12.6.2 使用时机 194
12.6.3 例:在xml中序列化一个部门层级(java) 194
12.7 单表继承(single table inheritance) 196
12.7.1 运行机制 197
12.7.2 使用时机 197
12.7.3 例:运动员的单表(c#) 198
12.7.4 从数据库中加载对象 199
12.8 类表继承(class table inheritance) 202
12.8.1 运行机制 202
12.8.2 使用时机 203
12.8.3 进一步阅读 203
12.8.4 例:运动员和他们的家属(c#) 203
12.9 具体表继承(concrete table inheritance) 208
12.9.1 运行机制 209
12.9.2 使用时机 210
12.9.3 例:具体运动员(c#) 210
12.10 继承映射器(inheritance mappers) 214
12.10.1 运行机制 215
12.10.2 使用时机 216
第13章 对象-关系元数据映射模式 217
13.1 元数据映射(metadata mapping) 217
13.1.1 运行机制 217
13.1.2 使用时机 218
13.1.3 例:使用元数据和反射(java) 219
13.2 查询对象(query object) 224
13.2.1 运行机制 225
13.2.2 使用时机 225
13.2.3 进一步阅读 226
13.2.4 例:简单的查询对象(java) 226
13.3 资源库(repository) 228
13.3.1 运行机制 229
13.3.2 使用时机 230
13.3.3 进一步阅读 231
13.3.4 例:查找一个人所在的部门(java) 231
13.3.5 例:资源库交换策略(java) 231
第14章 web表现模式 233
14.1 模型-视图-控制器(model view controller) 233
14.1.1 运行机制 233
14.1.2 使用时机 234
14.2 页面控制器(page controller) 235
14.2.1 运行机制 235
14.2.2 使用时机 236
14.2.3 例:servlet控制器和jsp视图的简单演示(java) 236
14.2.4 例:使用jsp充当处理程序(java) 238
14.2.5 例:代码隐藏的页面控制器(c#) 241
14.3 前端控制器(front controller) 243
14.3.1 运行机制 244
14.3.2 使用时机 245
14.3.3 进一步阅读 246
14.3.4 例:简单的显示(java) 246
14.4 模板视图(template view) 248
14.4.1 运行机制 249
14.4.2 使用时机 251
14.4.3 例:分离的控制器,使用jsp充当视图(java) 252
14.4.4 例:asp.net服务器页面(c#) 253
14.5 转换视图(transform view) 256
14.5.1 运行机制 256
14.5.2 使用时机 257
14.5.3 例:简单的转换(java) 257
14.6 两步视图(two step view) 259
14.6.1 运行机制 259
14.6.2 使用时机 260
14.6.3 例:两阶xslt(xslt) 264
14.6.4 例:jsp和定制标记(java) 266
14.7 应用控制器 ( application controller) 269
14.7.1 运行机制 270
14.7.2 使用时机 271
14.7.3 进一步阅读 271
14.7.4 例:状态模型应用控制器 (java) 271
第15章 分布模式 275
15.1 远程外观 (remote facade) 275
15.1.1 运行机制 276
15.1.2 使用时机 278
15.1.3 例:使用java语言的会话bean来作为远程外观(java) 278
15.1.4 例:web service(c#) 281
15.2 数据传输对象(data transfer object) 285
15.2.1 运行机制 285
15.2.2 使用时机 288
15.2.3 进一步阅读 289
15.2.4 例:传输唱片信息(java) 289
15.2.5 例:使用xml实现序列化(java) 293
第16章 离线并发模式 295
16.1 乐观离线锁(optimistic offline lock) 295
16.1.1 运行机制 296
16.1.2 使用时机 298
16.1.3 例:领域层与数据映射器(java) 298
16.2 悲观离线锁(pessimistic offline lock) 302
16.2.1 运行机制 303
16.2.2 使用时机 305
16.2.3 例:简单锁管理对象(java) 305
16.3 粗粒度锁(coarse-grained lock) 310
16.3.1 运行机制 310
16.3.2 使用时机 312
16.3.3 例:共享的乐观离线锁(java) 312
16.3.4 例:共享的悲观离线锁(java) 316
16.3.5 例:根对象乐观离线锁(java) 317
16.4 隐含锁(implicit lock) 318
16.4.1 运行机制 318
16.4.2 使用时机 319
16.4.3 例:隐含的悲观离线锁(java) 319
第17章 会话状态模式 321
17.1 客户会话状态(client session state) 321
17.1.1 运行机制 321
17.1.2 使用时机 322
17.2 服务器会话状态(server session state) 322
17.2.1 运行机制 322
17.2.2 使用时机 324
17.3 数据库会话状态(database session state) 324
17.3.1 运行机制 324
17.3.2 使用时机 325
第18章 基本模式 327
18.1 入口(gateway) 327
18.1.1 运行机制 327
18.1.2 使用时机 328
18.1.3 例:私有消息服务的入口(java) 329
18.2 映射器(mapper) 331
18.2.1 运行机制 332
18.2.2 使用时机 332
18.3 层超类型(layer supertype) 332
18.3.1 运行机制 332
18.3.2 使用时机 333
18.3.3 例:领域对象(java) 333
18.4 分离接口(separated interface) 333
18.4.1 运行机制 334
18.4.2 使用时机 335
18.5 注册表(registry) 335
18.5.1 运行机制 336
18.5.2 使用时机 337
18.5.3 例:单子注册表(java) 337
18.5.4 例:线程安全的注册表(java) 338
18.6 值对象(value object) 339
18.6.1 运行机制 339
18.6.2 使用时机 340
18.7 货币(money) 340
18.7.1 运行机制 341
18.7.2 使用时机 342
18.7.3 例:货币类(java) 343
18.8 特殊情况(special case) 346
18.8.1 运行机制 347
18.8.2 使用时机 347
18.8.3 进一步阅读 347
18.8.4 例:一个简单的空对象(c#) 347
18.9 插件(plugin) 348
18.9.1 运行机制 349
18.9.2 使用时机 350
18.9.3 例:id生成器(java) 350
18.10 服务桩(service stub) 352
18.10.1 运行机制 352
18.10.2 使用时机 353
18.10.3 例:销售税服务(java) 353
18.11 记录集(record set) 355
18.11.1 运行机制 355
18.11.2 使用时机 356
参考文献 359
0.1 架构 1
0.2 企业应用 2
0.3 企业应用的种类 3
0.4 关于性能的考虑 4
0.5 模式 6
0.5.1 模式的结构 7
0.5.2 模式的局限性 9
第一部分 表 述
第1章 分层 12
1.1 企业应用中层次的演化 13
1.2 三个基本层次 14
1.3 为各层选择运行环境 15
第2章 组织领域逻辑 19
2.1 抉择 22
2.2 服务层 23
第3章 映射到关系数据库 25
3.1 架构模式 25
3.2 行为问题 28
3.3 读取数据 29
.3.4 结构映射模式 30
3.4.1 关系的映射 30
3.4.2 继承 33
3.5 建立映射 34
3.6 使用元数据 35
3.7 数据库连接 36
3.8 其他问题 38
3.9 进一步阅读 38
第4章 web表现层 39
4.1 视图模式 41
4.2 输入控制器模式 43
4.3 进一步阅读 43
第5章 并发 45
5.1 并发问题 45
5.2 执行语境 46
5.3 隔离与不变性 47
5.4 乐观并发控制和悲观并发控制 48
5.4.1 避免不一致读 49
5.4.2 死锁 49
5.5 事务 50
5.5.1 acid 51
5.5.2 事务资源 51
5.5.3 减少事务隔离以提高灵活性 52
5.5.4 业务事务和系统事务 53
5.6 离线并发控制的模式 54
5.7 应用服务器并发 55
5.8 进一步阅读 56
第6章 会话状态 57
6.1 无状态的价值 57
6.2 会话状态 58
6.3 存储会话状态的方法 59
第7章 分布策略 61
7.1 分布对象的诱惑 61
7.2 远程接口和本地接口 62
7.3 必须使用分布的情况 63
7.4 关于分布边界 64
7.5 分布接口 64
第8章 通盘考虑 67
8.1 从领域层开始 67
8.2 深入到数据源层 68
8.2.1 事务脚本的数据源 68
8.2.2 表模块的数据源 69
8.2.3 领域模型的数据源 69
8.3 表现层 69
8.4 一些关于具体技术的建议 70
8.4.1 java和j2ee 70
8.4.2 .net 71
8.4.3 存储过程 71
8.4.4 web services 72
8.5 其他分层方式 72
第二部分 模 式
第9章 领域逻辑模式 76
9.1 事务脚本(transaction script) 76
9.1.1 运行机制 76
9.1.2 使用时机 77
9.1.3 收入确认问题 78
9.1.4 例:收入确认(java) 78
9.2 领域模型(domain model) 81
9.2.1 运行机制 81
9.2.2 使用时机 83
9.2.3 进一步阅读 83
9.2.4 例:收入确认(java) 84
9.3 表模块(table module) 87
9.3.1 运行机制 88
9.3.2 使用时机 90
9.3.3 例:基于表模块的收入确认(c#) 90
9.4 服务层(service layer) 93
9.4.1 运行机制 94
9.4.2 使用时机 96
9.4.3 进一步阅读 96
9.4.4 例:收入确认(java) 96
第10章 数据源架构模式 101
10.1 表数据入口(table data gateway) 101
10.1.1 运行机制 101
10.1.2 使用时机 102
10.1.3 进一步阅读 102
10.1.4 例:人员入口(c#) 103
10.1.5 例:使用ado.net数据集(c#) 104
10.2 行数据入口(row data gateway) 106
10.2.1 运行机制 107
10.2.2 使用时机 108
10.2.3 例:人员记录(java) 108
10.2.4 例:领域对象的数据保持器(java) 111
10.3 活动记录(active record) 112
10.3.1 运行机制 112
10.3.2 使用时机 113
10.3.3 例:一个简单的person类(java) 113
10.4 数据映射器(data mapper) 115
10.4.1 运行机制 116
10.4.2 使用时机 119
10.4.3 例:一个简单的数据映射器(java) 119
10.4.4 例:分离查找方法(java) 123
10.4.5 例:创建一个空对象(java) 126
第11章 对象-关系行为模式 129
11.1 工作单元(unit of work) 129
11.1.1 运行机制 129
11.1.2 使用时机 133
11.1.3 例:使用对象注册的工作单元(java) 134
11.2 标识映射(identity map) 137
11.2.1 运行机制 137
11.2.2 使用时机 139
11.2.3 例:标识映射中的方法(java) 139
11.3 延迟加载(lazy load) 140
11.3.1 运作机制 140
11.3.2 使用时机 142
11.3.3 例:延迟初始化(java) 142
11.3.4 例:虚代理(java) 142
11.3.5 例:使用值保持器(java) 144
11.3.6 例:使用重影(c#) 144
第12章 对象-关系结构模式 151
12.1 标识域(identity field) 151
12.1.1 工作机制 151
12.1.2 使用时机 154
12.1.3 进一步阅读 154
12.1.4 例:整型键(c#) 154
12.1.5 例:使用键表(java) 155
12.1.6 例:使用组合键(java) 157
12.2 外键映射(foreign key mapping) 166
12.2.1 运行机制 167
12.2.2 使用时机 169
12.2.3 例:单值引用(java) 169
12.2.4 例:多表查询(java) 172
12.2.5 例:引用集合(c#) 173
12.3 关联表映射(association tablemapping) 175
12.3.1 运行机制 176
12.3.2 使用时机 176
12.3.3 例:雇员和技能(c#) 177
12.3.4 例:使用直接的sql(java) 179
12.3.5 例:用一次查询查多个雇员(java) 182
12.4 依赖映射(dependent mapping) 186
12.4.1 运行机制 186
12.4.2 使用时机 187
12.4.3 例:唱片和曲目(java) 188
12.5 嵌入值(embedded value) 190
12.5.1 运行机制 190
12.5.2 使用时机 190
12.5.3 进一步阅读 191
12.5.4 例:简单值对象(java) 191
12.6 序列化lob(serialized lob) 192
12.6.1 运行机制 193
12.6.2 使用时机 194
12.6.3 例:在xml中序列化一个部门层级(java) 194
12.7 单表继承(single table inheritance) 196
12.7.1 运行机制 197
12.7.2 使用时机 197
12.7.3 例:运动员的单表(c#) 198
12.7.4 从数据库中加载对象 199
12.8 类表继承(class table inheritance) 202
12.8.1 运行机制 202
12.8.2 使用时机 203
12.8.3 进一步阅读 203
12.8.4 例:运动员和他们的家属(c#) 203
12.9 具体表继承(concrete table inheritance) 208
12.9.1 运行机制 209
12.9.2 使用时机 210
12.9.3 例:具体运动员(c#) 210
12.10 继承映射器(inheritance mappers) 214
12.10.1 运行机制 215
12.10.2 使用时机 216
第13章 对象-关系元数据映射模式 217
13.1 元数据映射(metadata mapping) 217
13.1.1 运行机制 217
13.1.2 使用时机 218
13.1.3 例:使用元数据和反射(java) 219
13.2 查询对象(query object) 224
13.2.1 运行机制 225
13.2.2 使用时机 225
13.2.3 进一步阅读 226
13.2.4 例:简单的查询对象(java) 226
13.3 资源库(repository) 228
13.3.1 运行机制 229
13.3.2 使用时机 230
13.3.3 进一步阅读 231
13.3.4 例:查找一个人所在的部门(java) 231
13.3.5 例:资源库交换策略(java) 231
第14章 web表现模式 233
14.1 模型-视图-控制器(model view controller) 233
14.1.1 运行机制 233
14.1.2 使用时机 234
14.2 页面控制器(page controller) 235
14.2.1 运行机制 235
14.2.2 使用时机 236
14.2.3 例:servlet控制器和jsp视图的简单演示(java) 236
14.2.4 例:使用jsp充当处理程序(java) 238
14.2.5 例:代码隐藏的页面控制器(c#) 241
14.3 前端控制器(front controller) 243
14.3.1 运行机制 244
14.3.2 使用时机 245
14.3.3 进一步阅读 246
14.3.4 例:简单的显示(java) 246
14.4 模板视图(template view) 248
14.4.1 运行机制 249
14.4.2 使用时机 251
14.4.3 例:分离的控制器,使用jsp充当视图(java) 252
14.4.4 例:asp.net服务器页面(c#) 253
14.5 转换视图(transform view) 256
14.5.1 运行机制 256
14.5.2 使用时机 257
14.5.3 例:简单的转换(java) 257
14.6 两步视图(two step view) 259
14.6.1 运行机制 259
14.6.2 使用时机 260
14.6.3 例:两阶xslt(xslt) 264
14.6.4 例:jsp和定制标记(java) 266
14.7 应用控制器 ( application controller) 269
14.7.1 运行机制 270
14.7.2 使用时机 271
14.7.3 进一步阅读 271
14.7.4 例:状态模型应用控制器 (java) 271
第15章 分布模式 275
15.1 远程外观 (remote facade) 275
15.1.1 运行机制 276
15.1.2 使用时机 278
15.1.3 例:使用java语言的会话bean来作为远程外观(java) 278
15.1.4 例:web service(c#) 281
15.2 数据传输对象(data transfer object) 285
15.2.1 运行机制 285
15.2.2 使用时机 288
15.2.3 进一步阅读 289
15.2.4 例:传输唱片信息(java) 289
15.2.5 例:使用xml实现序列化(java) 293
第16章 离线并发模式 295
16.1 乐观离线锁(optimistic offline lock) 295
16.1.1 运行机制 296
16.1.2 使用时机 298
16.1.3 例:领域层与数据映射器(java) 298
16.2 悲观离线锁(pessimistic offline lock) 302
16.2.1 运行机制 303
16.2.2 使用时机 305
16.2.3 例:简单锁管理对象(java) 305
16.3 粗粒度锁(coarse-grained lock) 310
16.3.1 运行机制 310
16.3.2 使用时机 312
16.3.3 例:共享的乐观离线锁(java) 312
16.3.4 例:共享的悲观离线锁(java) 316
16.3.5 例:根对象乐观离线锁(java) 317
16.4 隐含锁(implicit lock) 318
16.4.1 运行机制 318
16.4.2 使用时机 319
16.4.3 例:隐含的悲观离线锁(java) 319
第17章 会话状态模式 321
17.1 客户会话状态(client session state) 321
17.1.1 运行机制 321
17.1.2 使用时机 322
17.2 服务器会话状态(server session state) 322
17.2.1 运行机制 322
17.2.2 使用时机 324
17.3 数据库会话状态(database session state) 324
17.3.1 运行机制 324
17.3.2 使用时机 325
第18章 基本模式 327
18.1 入口(gateway) 327
18.1.1 运行机制 327
18.1.2 使用时机 328
18.1.3 例:私有消息服务的入口(java) 329
18.2 映射器(mapper) 331
18.2.1 运行机制 332
18.2.2 使用时机 332
18.3 层超类型(layer supertype) 332
18.3.1 运行机制 332
18.3.2 使用时机 333
18.3.3 例:领域对象(java) 333
18.4 分离接口(separated interface) 333
18.4.1 运行机制 334
18.4.2 使用时机 335
18.5 注册表(registry) 335
18.5.1 运行机制 336
18.5.2 使用时机 337
18.5.3 例:单子注册表(java) 337
18.5.4 例:线程安全的注册表(java) 338
18.6 值对象(value object) 339
18.6.1 运行机制 339
18.6.2 使用时机 340
18.7 货币(money) 340
18.7.1 运行机制 341
18.7.2 使用时机 342
18.7.3 例:货币类(java) 343
18.8 特殊情况(special case) 346
18.8.1 运行机制 347
18.8.2 使用时机 347
18.8.3 进一步阅读 347
18.8.4 例:一个简单的空对象(c#) 347
18.9 插件(plugin) 348
18.9.1 运行机制 349
18.9.2 使用时机 350
18.9.3 例:id生成器(java) 350
18.10 服务桩(service stub) 352
18.10.1 运行机制 352
18.10.2 使用时机 353
18.10.3 例:销售税服务(java) 353
18.11 记录集(record set) 355
18.11.1 运行机制 355
18.11.2 使用时机 356
参考文献 359
Patterns of Enterprise Application Architecture
光盘服务联系方式: 020-38250260 客服QQ:4006604884
云图客服:
用户发送的提问,这种方式就需要有位在线客服来回答用户的问题,这种 就属于对话式的,问题是这种提问是否需要用户登录才能提问
Video Player
×
Audio Player
×
pdf Player
×