《会话外观模式》|J2EE企业架构模式
关键词:Session Facade、会话外观、粗粒度会话Bean、减少远程调用、门面封装
说明:会话外观模式不属于GOF23设计模式,属于J2EE企业架构模式
一、什么是会话外观模式
会话外观模式(Session Facade Pattern):在J2EE EJB体系中,使用粗粒度的会话Bean作为外观,封装多个细粒度业务对象(实体Bean)的协作逻辑。客户端不再直接调用多个细粒度远程对象,只调用这一个会话外观对象。
本质是GOF外观模式(Facade) 在J2EE业务层的落地应用,专门用来解决EJB远程调用开销大的问题。

核心意图
提供单一粗粒度入口,封装多个细粒度业务组件的交互逻辑;减少客户端与EJB之间的远程调用次数,降低耦合。
角色划分
- Client(客户端):表现层代码,调用SessionFacade
- Session Facade(会话外观):粗粒度会话Bean,对外提供统一业务接口,内部协调多个细粒度业务对象
- Business Object(业务对象):细粒度业务组件(实体Bean/本地业务对象),完成原子业务逻辑
- Transfer Object(传输对象):DTO,用来向外传输业务数据
数据流:
Client → SessionFacade → BusinessObject1 / BusinessObject2 → 返回TransferObject
二、UML结构图
角色划分:
- Client:客户端,只依赖会话外观
- SessionFacade:会话外观,统一入口,编排多个业务对象
- BusinessObject:细粒度业务对象,实现原子业务
- TransferObject:数据传输载体

三、Java完整示例
模拟订单创建场景,会话外观封装订单、库存两个细粒度业务对象,代码全部使用英文。
// Business Object 细粒度业务对象
public class OrderBO {
public void createOrder() {
System.out.println("OrderBO: Create business order");
}
}
public class InventoryBO {
public void reduceStock() {
System.out.println("InventoryBO: Reduce product stock");
}
}
// Transfer Object
public class OrderTO {
private Long orderId;
public Long getOrderId() {
return orderId;
}
public void setOrderId(Long orderId) {
this.orderId = orderId;
}
}
// Session Facade 会话外观
public class OrderSessionFacade {
private OrderBO orderBO = new OrderBO();
private InventoryBO inventoryBO = new InventoryBO();
public OrderTO placeOrder() {
//编排多个细粒度业务
orderBO.createOrder();
inventoryBO.reduceStock();
OrderTO orderTO = new OrderTO();
orderTO.setOrderId(100001L);
return orderTO;
}
}
// Client
public class Client {
public static void main(String[] args) {
OrderSessionFacade facade = new OrderSessionFacade();
OrderTO orderTO = facade.placeOrder();
System.out.println("Created OrderId: " + orderTO.getOrderId());
}
}
运行输出:
OrderBO: Create business order
InventoryBO: Reduce product stock
Created OrderId: 100001
四、会话外观模式 vs GOF外观模式
| 模式 | 分类 | 核心区别 |
|---|---|---|
| 会话外观模式(Session Facade) | J2EE企业架构模式 | 面向EJB远程业务层,核心目标是减少远程调用,粗粒度会话Bean |
| 外观模式(Facade) | GOF结构型模式 | 通用,为复杂子系统提供统一访问入口,不限远程场景 |
会话外观是外观模式在分布式EJB业务层的特定实现。
五、会话外观模式 vs 业务代表模式
| 模式 | 定位 | 层级 |
|---|---|---|
| 会话外观 | 业务层,业务编排入口 | 封装内部多个细粒度业务对象,客户端调用会话外观完成业务 |
| 业务代表 | 表现层与业务层中间 | 表现层通过业务代表去调用业务服务(会话外观) |
典型组合链路:Client → BusinessDelegate → SessionFacade → BusinessObject
六、优缺点总结
✅ 优点
- 客户端只需要一次远程调用,完成多步业务流程,大幅降低远程网络开销
- 业务对象之间的协作逻辑集中在会话外观,客户端代码简化
- 细粒度业务对象被隐藏,客户端不感知内部多个业务组件
- 权限、事务可以统一在会话外观控制
❌ 缺点
- 会话外观容易膨胀,承载过多业务逻辑,变成大而全的类
- 粒度不好把控,过于粗粒度会降低复用性
- 起源EJB规范,现代SpringBoot很少手写会话Bean;思想依然广泛使用
七、框架应用场景
- 经典J2EE EJB会话Bean开发
- 现代开发思想:业务服务层Service,一个Service编排多个Repository/BO,就是会话外观思想延续
- 领域应用层的Application Service(DDD应用服务)
八、小结
会话外观模式核心:提供粗粒度的会话外观作为业务层统一入口,内部编排多个细粒度业务对象,客户端只调用外观,减少远程调用,隔离业务内部细节。
归属:J2EE架构模式,不属于GOF23;底层基于GOF外观模式思想。
0 条笔记