Java 中的业务代理模式:简化业务服务交互
大约 3 分钟
也称为
- 服务代表
业务代理设计模式的意图
业务代理模式是 Java 中的一种结构型设计模式,它在表示层和业务层之间添加了一个抽象层。通过使用这种模式,我们可以在层之间实现松耦合,并将关于如何定位、连接和交互构成应用程序的业务对象的知识封装起来。
业务代理模式的详细解释,并附带实际例子
实际例子
在使用 Java EE 的企业应用程序中,业务代理模式有助于管理不同业务服务之间的交互。
想象一家餐厅,服务员充当顾客和厨房之间的中介。当顾客点餐时,服务员将订单送到厨房,传达任何特殊要求,然后将准备好的食物送回给顾客。服务员将厨房操作的复杂性抽象化,使厨师能够专注于烹饪,而无需直接与顾客互动。这种设置使客户服务(表示层)和厨房(业务服务)能够独立高效地运行。服务员充当业务代理,管理沟通并确保两个不同区域之间的顺畅交互。
通俗易懂
业务代理在表示层和业务层之间添加了一层抽象。
维基百科说
业务代理是一种 Java EE 设计模式。这种模式旨在减少业务服务与连接的表示层之间的耦合,并隐藏服务的实现细节(包括 EJB 架构的查找和访问)。业务代理充当适配器,从表示层调用业务对象。
Java 中业务代理模式的编程示例
以下 Java 代码演示了如何实现业务代理模式。这种模式在需要松耦合和高效服务交互的应用程序中特别有用。
一个手机应用程序承诺将任何现有的电影流式传输到您的设备。它捕获用户的搜索字符串并将其传递给业务代理。业务代理选择最合适的视频流服务并从那里播放视频。
首先,我们对视频流服务进行抽象,并提供几个实现。
public interface VideoStreamingService {
void doProcessing();
}
@Slf4j
public class NetflixService implements VideoStreamingService {
@Override
public void doProcessing() {
LOGGER.info("NetflixService is now processing");
}
}
@Slf4j
public class YouTubeService implements VideoStreamingService {
@Override
public void doProcessing() {
LOGGER.info("YouTubeService is now processing");
}
}
然后,我们有一个查找服务,它决定使用哪个视频流服务。
@Setter
public class BusinessLookup {
private NetflixService netflixService;
private YouTubeService youTubeService;
public VideoStreamingService getBusinessService(String movie) {
if (movie.toLowerCase(Locale.ROOT).contains("die hard")) {
return netflixService;
} else {
return youTubeService;
}
}
}
业务代理使用业务查找将电影播放请求路由到合适的视频流服务。
@Setter
public class BusinessDelegate {
private BusinessLookup lookupService;
public void playbackMovie(String movie) {
VideoStreamingService videoStreamingService = lookupService.getBusinessService(movie);
videoStreamingService.doProcessing();
}
}
移动客户端利用业务代理来调用业务层。
public class MobileClient {
private final BusinessDelegate businessDelegate;
public MobileClient(BusinessDelegate businessDelegate) {
this.businessDelegate = businessDelegate;
}
public void playbackMovie(String movie) {
businessDelegate.playbackMovie(movie);
}
}
最后,我们可以演示完整的示例的实际操作。
public static void main(String[] args) {
// prepare the objects
var businessDelegate = new BusinessDelegate();
var businessLookup = new BusinessLookup();
businessLookup.setNetflixService(new NetflixService());
businessLookup.setYouTubeService(new YouTubeService());
businessDelegate.setLookupService(businessLookup);
// create the client and use the business delegate
var client = new MobileClient(businessDelegate);
client.playbackMovie("Die Hard 2");
client.playbackMovie("Maradona: The Greatest Ever");
}
以下是控制台输出。
21:15:33.790 [main] INFO com.iluwatar.business.delegate.NetflixService - NetflixService is now processing
21:15:33.794 [main] INFO com.iluwatar.business.delegate.YouTubeService - YouTubeService is now processing
业务代理模式类图

何时在 Java 中使用业务代理模式
在以下情况下使用业务代理模式
- 您需要表示层和业务层之间的松耦合,或者需要抽象化服务查找。
- 您希望编排对多个业务服务的调用
- 您希望封装服务查找和服务调用
- 需要抽象和封装客户端层与业务服务之间的通信
业务代理模式 Java 教程
Java 中业务代理模式的实际应用
- 使用 Java EE(Java Platform, Enterprise Edition)的企业应用程序
- 需要远程访问业务服务的应用程序
业务代理模式的优缺点
优点
- 表示层和业务层的解耦:允许客户端层和业务服务独立演进。
- 位置透明性:客户端不受业务服务位置或实例化的更改的影响。
- 可重用性和可扩展性:业务代理对象可以被多个客户端重用,并且这种模式支持负载均衡和可扩展性。
权衡
- 复杂性:引入额外的层和抽象,这可能会增加复杂性。
- 性能开销:额外的间接访问可能会导致轻微的性能损失。