前言

本文主要内容

  • 介绍门面模式
  • 介绍通用代码及类图
  • 使用举例

正文

介绍

Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface that makes the subsystem easier to use.(要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。) -设计模式之禅第2版

也就是将复杂内容封装,只暴露给用户一个调用方法的窗口。至于方法是那个类的,怎样实现的,用户不需要知道

通用类图及代码

类图

门面模式 - 图1

通用代码

Facade:暴露给调用者

  1. package cn.zjm404.stu.design.organization.facade;
  2. public class Facade {
  3. private Sub1 sub1 = new Sub1();
  4. private Sub2 sub2 = new Sub2();
  5. public void method1(){
  6. sub1.do1();
  7. }
  8. public void method2(){
  9. sub2.do2();
  10. }
  11. }

Sub:被Facade隐藏的子系统

  1. package cn.zjm404.stu.design.organization.facade;
  2. public class Sub1 {
  3. public void do1(){
  4. }
  5. }
  1. package cn.zjm404.stu.design.organization.facade;
  2. public class Sub2 {
  3. public void do2(){
  4. }
  5. }

Client:调用Facade中的方法

  1. package cn.zjm404.stu.design.organization.facade;
  2. public class Client {
  3. public static void main(String[] args) {
  4. Facade facade = new Facade();
  5. facade.method1();
  6. facade.method2();
  7. }
  8. }

使用举例

可以看下MyBatis中SqlSession接口的实现类DefaultSqlSession,使用MyBatis对数据库操作时,是通过SqlSession这一个接口进行的,也就是它就是MyBatis中多个模块的一个门面(具体是哪几个模块,看下面图中的封装的属性就可以了)
image.png
在使用时,是什么样子呢?(详细的内容可以看MyBatis源码学习中的MyBatis概览)
可以看到并未暴露门面模式中封装的子系统类
image.png
(这里是又是建造模式又是工厂模式的,一路扒下来,实现类是DefaultSqlSession)
再看看getMapper的实现
image.png
可以看到是调用的子系统configuration对象的方法

参考

设计模式之禅第2版