外观模式
一、模式名
外观, Facade
二、解决的问题
外观模式,顾名思义,对外提供了应用的统一外观接口。外观模式在大型系统应用比较多,大型系统中,类和方法之间的调用关系和依赖关系复杂,有时无法完全了解,比如完成某项工作,需要使用十几个类和方法完成,可能这十几个类和方法的调用顺序,只有某些核心员工才完全了解,对于新人很不友好。为了降低上层系统或调用方的复杂性,提出了外观模式,用于为上层系统或调用方提供统一的接口,上层系统实现某些功能,只需要使用Facade接口,这要简化了开发过程。
Facade模式的优点用一句话来形容就是:下面千条线,上面一根针
三、解决方案
外观模式的UML图如下所示。
代码如下:
public class FacadeTest { public static void main(String[] args) { // 调用方只需要关心Facade层即可 // 下面千条线,上面一根针 Facade facade = new Facade(); String userCart = facade.getUserCart(1); System.out.println(userCart); } } class Facade { private UserService userService = new UserService(); private OrderCartService orderCartService = new OrderCartService(); private AddressService addressService = new AddressService(); /** * 获取用户组单信息 * @return 组单信息 */ public String getUserCart(long userId) { User user = userService.getUserId(userId); List<OrderCartItem> orderCartItem = orderCartService.getOrderCartItem(userId); List<Address> address = addressService.getAddress(userId); return user.toString() + " " + orderCartItem.toString() + " " + address.toString(); } } class UserService { public User getUserId(long userId) { // 根据userId查询数据库获取用户信息 User user = new User(); return user; } } class OrderCartService { public List<OrderCartItem> getOrderCartItem(long userId) { // 根据userId查询数据库获取用户购物车信息 List<OrderCartItem> orderCartItems = new ArrayList<>(); return orderCartItems; } } class AddressService { public List<Address> getAddress(long userId) { // 根据userId查询数据库获取用户地址信息 List<Address> addresses = new ArrayList<>(); return addresses; } } class User { private long userId; private String userName; private String userDesc; } class OrderCartItem { private long skuId; private int count; private BigDecimal price; } class Address { private String province; private String city; private String country; private String street; private String detail; }
常见应用场景
1. 一般的大型系统都会在Service层封装一层Facade层