外观模式

一、模式名

外观, Facade

二、解决的问题

外观模式,顾名思义,对外提供了应用的统一外观接口。外观模式在大型系统应用比较多,大型系统中,类和方法之间的调用关系和依赖关系复杂,有时无法完全了解,比如完成某项工作,需要使用十几个类和方法完成,可能这十几个类和方法的调用顺序,只有某些核心员工才完全了解,对于新人很不友好。为了降低上层系统或调用方的复杂性,提出了外观模式,用于为上层系统或调用方提供统一的接口,上层系统实现某些功能,只需要使用Facade接口,这要简化了开发过程。

Facade模式的优点用一句话来形容就是:下面千条线,上面一根针

三、解决方案

外观模式的UML图如下所示。

clipboard

代码如下:

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层

posted @ 2019-06-22 16:23  锢浪熟阳  阅读(221)  评论(0编辑  收藏  举报