自学教程 学编程从这里开始

会话外观模式

《会话外观模式》|J2EE企业架构模式

关键词:Session Facade、会话外观、粗粒度会话Bean、减少远程调用、门面封装
说明:会话外观模式不属于GOF23设计模式,属于J2EE企业架构模式

一、什么是会话外观模式

会话外观模式(Session Facade Pattern):在J2EE EJB体系中,使用粗粒度的会话Bean作为外观,封装多个细粒度业务对象(实体Bean)的协作逻辑。客户端不再直接调用多个细粒度远程对象,只调用这一个会话外观对象。
本质是GOF外观模式(Facade) 在J2EE业务层的落地应用,专门用来解决EJB远程调用开销大的问题。

核心意图
提供单一粗粒度入口,封装多个细粒度业务组件的交互逻辑;减少客户端与EJB之间的远程调用次数,降低耦合。

角色划分

  1. Client(客户端):表现层代码,调用SessionFacade
  2. Session Facade(会话外观):粗粒度会话Bean,对外提供统一业务接口,内部协调多个细粒度业务对象
  3. Business Object(业务对象):细粒度业务组件(实体Bean/本地业务对象),完成原子业务逻辑
  4. Transfer Object(传输对象):DTO,用来向外传输业务数据

数据流:
Client → SessionFacade → BusinessObject1 / BusinessObject2 → 返回TransferObject

二、UML结构图

角色划分:

  1. Client:客户端,只依赖会话外观
  2. SessionFacade:会话外观,统一入口,编排多个业务对象
  3. BusinessObject:细粒度业务对象,实现原子业务
  4. 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

六、优缺点总结

✅ 优点

  1. 客户端只需要一次远程调用,完成多步业务流程,大幅降低远程网络开销
  2. 业务对象之间的协作逻辑集中在会话外观,客户端代码简化
  3. 细粒度业务对象被隐藏,客户端不感知内部多个业务组件
  4. 权限、事务可以统一在会话外观控制

❌ 缺点

  1. 会话外观容易膨胀,承载过多业务逻辑,变成大而全的类
  2. 粒度不好把控,过于粗粒度会降低复用性
  3. 起源EJB规范,现代SpringBoot很少手写会话Bean;思想依然广泛使用

七、框架应用场景

  • 经典J2EE EJB会话Bean开发
  • 现代开发思想:业务服务层Service,一个Service编排多个Repository/BO,就是会话外观思想延续
  • 领域应用层的Application Service(DDD应用服务)

八、小结

会话外观模式核心:提供粗粒度的会话外观作为业务层统一入口,内部编排多个细粒度业务对象,客户端只调用外观,减少远程调用,隔离业务内部细节。

归属:J2EE架构模式,不属于GOF23;底层基于GOF外观模式思想。

标签:

0 条笔记