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

业务代表模式

《业务代表模式》|J2EE企业架构模式

关键词:Business Delegate、业务代表、解耦表现层与业务层、降低耦合、J2EE模式
说明:业务代表模式不属于GOF23设计模式,属于J2EE企业架构模式

一、什么是业务代表模式

业务代表模式(Business Delegate Pattern):用于解耦表现层(UI/Controller)和业务服务层。表现层不直接调用远程业务服务,通过业务代表(Business Delegate)作为中间代理。
业务代表封装查找、创建、调用业务服务的复杂逻辑,屏蔽业务服务的定位、远程调用细节。表现层只依赖业务代表,不需要感知EJB、远程服务等底层实现。

核心意图
隔离表现层与业务服务;将业务服务查找、实例获取、调用异常处理交给业务代表,简化前端控制器代码。

角色划分

  1. Client(客户端/表现层):如Controller、UI层,调用BusinessDelegate
  2. Business Delegate(业务代表):对外提供业务方法,内部查找并调用BusinessService
  3. Lookup Service(查询服务):负责查找、定位业务服务,服务工厂
  4. Business Service(业务服务):业务接口,包含业务方法;可以有本地/远程实现(如EJB)
  5. Concrete Business Service(具体业务服务):业务逻辑实现

数据流:
Client → BusinessDelegate → LookupService → BusinessService

二、UML结构图

角色划分:

  1. Client:表现层代码,依赖BusinessDelegate
  2. BusinessDelegate:持有BusinessService引用,接收客户端请求
  3. LookupService:服务查找器,获取业务服务实例
  4. BusinessService:业务服务抽象接口
  5. ConcreteBusinessService:业务服务具体实现

三、Java完整示例

场景:订单业务服务,表现层通过BusinessDelegate调用订单服务。代码全部使用英文。

// Business Service
public interface BusinessService {
    void doTask();
}

// Concrete Business Service
public class OrderService implements BusinessService {
    @Override
    public void doTask() {
        System.out.println("OrderService: process order business logic");
    }
}

public class PaymentService implements BusinessService {
    @Override
    public void doTask() {
        System.out.println("PaymentService: process payment business logic");
    }
}

// Lookup Service
public class LookupService {
    public BusinessService getBusinessService(String serviceType) {
        if ("ORDER".equalsIgnoreCase(serviceType)) {
            return new OrderService();
        } else if ("PAYMENT".equalsIgnoreCase(serviceType)) {
            return new PaymentService();
        }
        return null;
    }
}

// Business Delegate
public class BusinessDelegate {
    private LookupService lookupService = new LookupService();
    private BusinessService businessService;

    public void setServiceType(String serviceType) {
        businessService = lookupService.getBusinessService(serviceType);
    }

    public void doTask() {
        businessService.doTask();
    }
}

// Client
public class Client {
    public static void main(String[] args) {
        BusinessDelegate businessDelegate = new BusinessDelegate();

        businessDelegate.setServiceType("ORDER");
        businessDelegate.doTask();

        businessDelegate.setServiceType("PAYMENT");
        businessDelegate.doTask();
    }
}

运行输出:

OrderService: process order business logic
PaymentService: process payment business logic

四、业务代表模式 vs DAO模式

模式作用分层位置
Business Delegate隔离表现层 ↔ 业务服务层Web层与业务层中间
DAO隔离业务层 ↔ 数据库持久层业务层与数据库中间

五、优缺点总结

✅ 优点

  1. 解耦表现层和业务服务,客户端无需感知服务查找与实例化
  2. 集中管理业务服务的查找、异常处理
  3. 业务服务变更,客户端代码不需要改动
  4. 减少表现层与远程业务服务之间的网络调用次数

❌ 缺点

  1. 增加额外中间层,少量增加代码复杂度
  2. 多一层转发,轻微增加调用链路
  3. 现代Spring开发中,依赖注入已经替代LookupService,原生业务代表使用变少

六、框架应用场景

  • 经典J2EE / EJB体系架构(当年用来访问远程EJB业务组件)
  • 早期Java Web项目,表现层需要调用远程业务服务

现代SpringBoot开发,IOC容器承担了LookupService的职责,业务代表模式很少手写;但其思想依然保留,常用在网关、远程服务代理场景。

七、小结

业务代表模式核心:业务代表作为表现层与业务服务之间的代理,封装服务查找和调用细节,客户端只调用业务代表,不和底层业务服务直接耦合。

归属:J2EE架构模式,不属于GOF23。

标签:

0 条笔记