java设计模式-外观模式或门面模式(六)

外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用。

简单来说,该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用。这个模式中,设计到3个角色。
  1).门面角色:外观模式的核心。它被客户角色调用,它熟悉子系统的功能。内部根据客户角色的需求预定了几种功能的组合。
  2).子系统角色:实现了子系统的功能。它对客户角色和Facade时未知的。它内部可以有系统内的相互交互,也可以由供外界调用的接口。
  3).客户角色:通过调用Facade来完成要实现的功能。
java设计模式-外观模式或门面模式(六)_第1张图片
比如我们网上购物,下单流程。第一步调用用户系统检查用户的合法性,第二步调用风控系统日限额等风险检查,第三步调用订单系统保存订单。
用户系统

/**
 * 用户系统
 */
public class UserSystem {
    public void userCheck(){
        System.out.println("检查用户合法");
    }
}

风控系统

/**
 * 风控系统
 */
public class RiskSystem {
    /**风控检查*/
    public void riskCheck(){
        System.out.println("风控检查");
    }
}

订单系统

/**
 * 订单系统
 */
public class OrderSystem {
    /**订单保存*/
    public void orderSave(){
        System.out.println("订单入库");
    }
}

外观核心类:

public class Facade {
    private UserSystem userSystem = new UserSystem();
    private RiskSystem riskSystem = new RiskSystem();
    private OrderSystem orderSystem = new OrderSystem();

    /**下单*/
    public void order(){
        userSystem.userCheck();
        riskSystem.riskCheck();
        orderSystem.orderSave();
    }
}

客户端此时只调用下单流程,而并不关注下单流程里执行了什么。减少了客户端使用的复杂度。一定程度上提高了封装性。

public class Client {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.order();
    }
}

好处:
1.使得客户端和子系统之间解耦,让子系统内部的模块功能更容易扩展和维护;
2.客户端根本不需要知道子系统内部的实现,或者根本不需要知道子系统内部的构成,它只需要跟Facade类交互即可
3.有些方法是对系统外的,有些方法是系统内部相互交互的使用的。子系统把那些暴露给外部的功能集中到门面中,这样就可以实现客户端的使用,很好的隐藏了子系统内部的细节
缺点:在外观模式中,当增加或移除子系统时需要修改外观类,这违背了“开闭原则”。如果引入抽象外观类,可以在一定程度上解决。
其实我们可能在之前的开发早已使用,只是不知道叫外观模式。比如 service类调用多个dao,service就是一个外观类。
源码参考:https://gitee.com/lifengit/javapatterns

你可能感兴趣的:(java设计模式,外观模式,门面模式)