概述
外观模式(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");
}