zoukankan      html  css  js  c++  java
  • 外观模式

    一、模式名

    外观, 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层

  • 相关阅读:
    java编程题古典算法之兔子问题
    java基础之final关键字
    java基础之final关键字
    java基础之静态代码块,局部代码块,构造代码块区别。
    java基础之静态代码块,局部代码块,构造代码块区别。
    java基础之完数判断
    java基础之完数判断
    java基础之二维数组不定义列数
    正则表达式快速入门
    深入理解JSON对象
  • 原文地址:https://www.cnblogs.com/glsy/p/11069283.html
Copyright © 2011-2022 走看看