定义
提供一个高层次的接口,使得子系统更易于使用
使用场景
当你的程序有很多个模块,或者说子系统。你希望给用户提供一个统一的操作界面类,而不是让用户分别与这些模块交互。
一种设计是:给用户提供一套面板方用来法完成一般性的功能,如果面板提供的方法不能满足用户需求,用户还可以直接使用具体模块的功能来达到自己的目的。
另一种设计是:用户完全看不到各子模块,所有操作必须通过面板来完成,如果面板没有提供相应的功能,那也就gg了
实例
/**
* 外观模式:提供一个高层次的接口,使得子系统更易于使用
* 使用场景:
* 当你的程序有很多个模块,或者说子系统,你希望给用户提供一个统一的操作界面类,而不是让用户分别与这些模块交互
* @author
* @date 2023/02/01 16:30
**/
public class ReportFacade {
public static void main(String[] args) {
OrderSys orderSys = new OrderSys();
PaymentSys paymentSys = new PaymentSys(orderSys);
DeliverSys deliverSys = new DeliverSys();
final String orderNum = orderSys.getOrderNum();
System.out.println(String.format("\n报表\n------------------"+
"订单号:%s | 金额:%s元 | 配送耗时:%s分钟",
orderNum,
paymentSys.getOrderAccount(orderNum).toPlainString(),
String.valueOf(deliverSys.getDeliverTime() / 60)));
}
}
// 订单系统
class OrderSys{
public String getOrderNum() {
System.out.println("获取订单号");
return "123456";
}
}
// 支付系统
class PaymentSys {
private OrderSys orderSys;
public PaymentSys(OrderSys orderSys) {
this.orderSys = orderSys;
}
public BigDecimal getOrderAccount(String orderNum){
System.out.println(String.format("获取%s订单支付金额",orderNum));
return BigDecimal.valueOf(500);
}
}
// 物流系统
class DeliverSys {
public int getDeliverTime() {
System.out.println("获取配送耗时");
return 30*60;
}
}