0
点赞
收藏
分享

微信扫一扫

设计模式专栏——外观模式(Facade)

概述

外观模式(Facade Pattern),又称为门面模式,是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。这种类型的设计模式属于结构型设计模式。

它的核心结构有三个角色:外观角色(Facade)、构成系统的许多其他角色、客户端(Client)。

(1)Facade角色:这个外观类为子系统提供一个共同的对外接口。

(2) 构成系统的许多其他角色:系统中的众多类或者服务,这些角色各自完成自己的工作,它们并不知道Facade角色的存在,也不会调用到Facade角色。

(3) 客户端角色:Client角色使用Facade角色来对外提供访问接口。

我们MVC模式中,Controller层,调用多个Service层,对外提供访问,就是Facade模式,Service层调用多个Repository也是。我们接下来以在线上下订单,需要调用到订单系统、库存系统、物流系统来展开讨论。

类图

示例

库存服务

public class StockService {
    static AtomicInteger atomicInteger = new AtomicInteger();

    /**
     * 初始化库存数量
     */
    static {
        atomicInteger.set(5);
    }

    /**
     * 减库存
     * @param goods goods
     */
    public void reduceStock(String goods){
        int stock = atomicInteger.decrementAndGet();
        System.out.println(goods + ",库存减1,还剩" + stock);
    }

    /**
     * 检查库存
     * @param goods goods
     * @return boolean
     */
    public boolean checkStock(String goods){
        if(atomicInteger.get() > 0){
            return true;
        }
        return false;
    }
}

订单服务

public class OrderService {
    public void addOrder(String userId, String goods){
        System.out.println(userId + "下订单" + goods  + " 1个");
    }
}

物流服务

public class LogisticsService {
    public void delivery(String userId, String goods){
        System.out.println("配送商品" + goods);
    }
}

Faca角色

public class OrderMaker {
    public void placeOrder(String userId, String goods){
        OrderService orderService = new OrderService();
        StockService stockService = new StockService();
        LogisticsService logisticsService = new LogisticsService();
        if(stockService.checkStock(goods)){
            orderService.addOrder(userId, goods);
            stockService.reduceStock(goods);
            logisticsService.delivery(userId, goods);
        }else{
            System.out.println("库存不足,无法下单");
        }

    }

}

客户端

    public static void main(String[] args) {
        OrderMaker orderMaker = new OrderMaker();
        orderMaker.placeOrder("user1", "good1");
        orderMaker.placeOrder("user2", "good1");
        orderMaker.placeOrder("user3", "good1");
        orderMaker.placeOrder("user4", "good1");
        orderMaker.placeOrder("user5", "good1");
        orderMaker.placeOrder("user6", "good1");
    }

举报

相关推荐

0 条评论