本文源码:GitHub·点这里 || GitEE·点这里

一、生活场景

1、场景描述

在移动互联网没有普及之前,去饭店吃饭的流程大致如下:选座位,排队,点菜,结账。后来移动互联网普及,通过手机APP就可以操作这些流程,非常的方便快捷:通过手机可以知道某饭店是不是还有空位,到了饭店之后直接入座,然后通过手机点菜,结账,中间省去了很多繁琐的流程。

2、代码图解

3、代码实现

/*** 外观模式描述饭店就餐流程*/
public class C01_InScene {public static void main(String[] args) {EatAppFacade eatAppFacade = new EatAppFacade () ;eatAppFacade.dining();}
}
// 预定
class Booking {private static Booking booking = new Booking() ;public static Booking getInstance (){return booking ;}public void bookPlace (){System.out.println("位置预定...");}
}
// 点餐
class TakeOrder {private static TakeOrder takeOrder = new TakeOrder ();public static TakeOrder getInstance (){return takeOrder ;}public void orderDishes (){System.out.println("点餐...");}
}
// 付款
class Payment {private static Payment payment = new Payment () ;public static Payment getInstance (){return payment ;}public void payMoney (){System.out.println("结账...");}
}
// 点餐APP
class EatAppFacade {private Booking booking ;private TakeOrder takeOrder ;private Payment payment ;public EatAppFacade (){this.booking = Booking.getInstance() ;this.takeOrder = TakeOrder.getInstance() ;this.payment = Payment.getInstance() ;}// 就餐流程public void dining (){booking.bookPlace();takeOrder.orderDishes();payment.payMoney();}
}

二、外观设计模式

1、基本简介

外观模式是对象的结构模式,客户端与一个子系统的通信必须通过一个统一的外观对象进行。外观模式提供一个高层次的接口,使得子系统更易于使用。

2、模式图解

3、核心角色

  • 外观角色

客户端可以调用这个角色的方法。此角色具有相关的子模块的功能。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。

  • 子模块角色

可以同时有一个或者多个子模块。每个子模块都不是一个单独的类,而是一个类的集合(如上面的子模块就是由ModuleA、ModuleB、ModuleC三个类组合而成)。每个子系统都可以被客户端直接调用,或者被外观角色调用。子模块并不知道外观的存在,对于子模块而言,外观角色仅仅是另外一个客户端。

  • 客户端角色

外观对象功能的调用者。

4、源代码实现

public class C02_Facade {public static void main(String[] args) {Facade facade = new Facade();facade.clientNeed1();facade.clientNeed2();}
}
class ModuleA {public void testA (){System.out.println("ModuleA.testA()");}
}
class ModuleB {public void testB (){System.out.println("ModuleB.testB()");}
}
class ModuleC {public void testC (){System.out.println("ModuleC.testC()");}
}
class Facade {/*** 客户需求1*/public void clientNeed1 (){ModuleA moduleA = new ModuleA();moduleA.testA();ModuleB moduleB = new ModuleB();moduleB.testB();}/*** 客户需求1*/public void clientNeed2 (){ModuleB moduleB = new ModuleB();moduleB.testB();ModuleC moduleC = new ModuleC();moduleC.testC();}
}

三、Mybatis应用场景

1、使用场景

  • org.apache.ibatis.session.Configuration
  • org.apache.ibatis.reflection.MetaObject

Configuration 创建 MetaObject 的时候。

2、Configuration源码

public class Configuration {protected ObjectFactory objectFactory;protected ObjectWrapperFactory objectWrapperFactory;public Configuration() {this.objectFactory = new DefaultObjectFactory();this.objectWrapperFactory = new DefaultObjectWrapperFactory();}public MetaObject newMetaObject(Object object) {return MetaObject.forObject(object, this.objectFactory, this.objectWrapperFactory);}// ... 省去其他源码
}

3、MetaObject 源码

public static MetaObject forObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory) {return object == null ? SystemMetaObject.NULL_META_OBJECT : new MetaObject(object, objectFactory, objectWrapperFactory);
}

四、优缺点总结

松散了客户端与子模块的耦合关系,使子模块功能的调用更加简单。通过合理使用Facade,可以更好地划分访问的层次。有些方法是对系统外的,有些方法是系统内部使用的,把需要暴露给外部的功能集中到门面中。如果过多的使用外观模式,会让子模块功能的维护变的复杂,一个功能方法改变,会牵扯到多个外观对象的改变。

五、源代码地址

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

Java描述设计模式(12):外观模式相关推荐

  1. Java描述设计模式(05):原型模式

    一.原型模式简介 1.基础概念 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. 2.模式结构 原型模式要求对象实现一个 ...

  2. 设计模式之外观模式php,PHP设计模式:外观模式

    前言 菜鸟教程对外观模式的描述是:外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口, ...

  3. 研磨设计模式之外观模式(Facade)(解决方案)

    3.2  解决方案 3.2.1  外观模式来解决 用来解决上述问题的一个合理的解决方案就是外观模式.那么什么是外观模式呢? (1)外观模式定义 这里先对两个词进行一下说明,一个是界面,一个是接口. 界 ...

  4. JS常用的设计模式(7)—— 外观模式

    JS常用的设计模式(7)-- 外观模式 外观模式(门面模式),是一种相对简单而又无处不在的模式.外观模式提供一个高层接口,这个接口使得客户端或子系统更加方便调用. 用一段再简单不过的代码来表示 var ...

  5. Swift 中的设计模式 #3 外观模式与适配器模式

    作者:Andrew Jaffee,原文链接,原文日期:2018-09-04 译者:郑一一:校对:BigNerdCoding,pmst,Forelax:定稿:Forelax 本文是我的设计模式系列教程的 ...

  6. 初学Java常用设计模式之——原型模式

    声明:转载请附上原文链接 提示:标题序号从3开始,是照应不同设计模式笔记发布的顺序而定的,比如,第上一篇文章 初学Java常用设计模式之--工厂模式 序号从2开始. 标题后面之所以加上了解,是因为相对 ...

  7. Javascript 设计模式之外观模式【讲师辅导】-曾亮-专题视频课程

    Javascript 设计模式之外观模式[讲师辅导]-770人已学习 课程介绍         随着 javascript ES6/7 的发布,很多老版本的设计模式的实现,今天来看是错误的,将被彻底. ...

  8. 设计模式之外观模式(九)

    目录 1. 背景 1.1 问题描述 1.2 外观模式简介 2. 外观模式 2.1 外观模式解决上述问题 2.2 外观模式在mybatis框架应用的源码分析 1. 背景 1.1 问题描述 组建一个家庭影 ...

  9. 移动开发 | Swift 中的设计模式 #3 外观模式与适配器模式

    本文是我的设计模式系列教程的第三篇.在第一篇文章中,我介绍了 创建型模式中的工厂模式和单例模式.在第二篇文章中,又讨论了一下 行为型模式中的观察者模式和备忘录模式. 在本文中,我会就结构型模式中的外观 ...

最新文章

  1. spring中间scope详细解释
  2. Windows Server应用之32位系统如何安装64位打印机驱动
  3. linux用8m内存读取1g日志,检查 Linux 中内存使用状况的 8 条命令
  4. android 默认浏览器 视频播放 二维码,Android调用系统默认浏览器访问的方法
  5. 小扎展示Facebook十年产品路线图,跳票的智能音箱又有新爆料
  6. 【前端】数组元素过滤
  7. web前端人事面试常问问题
  8. YiDB在翼支付账单业务的应用实践
  9. 植物大战僵尸 修改存档和金钱
  10. android opengl 简书,Android OpenGL入门
  11. 400 行 C 代码实现一个虚拟机
  12. Centos下安装桌面环境和Flash插件
  13. HTTP/1.1(消息格式、连接管理、条件请求、范围请求、缓存、身份验证)
  14. Multiple PDN Connectivity
  15. R语言统计入门第六章——回归与相关性
  16. 手机adb调试出现Not running as root. Try“adb root“ first.
  17. 关于深度论坛进不去的原因
  18. 关于高斯光学的一些知识
  19. 【TMT数据传不到MES中间库】-F18
  20. 2021牛年的春节一个人过

热门文章

  1. (数据库系统概论|王珊)第十章数据库恢复技术-第四、五、六、七节:数据库恢复技术和数据库镜像
  2. Linux下安装Octave
  3. golang日志输出
  4. 《论文笔记》Adaptive decentralised_cooperative_vision_based_simultaneous_localization_and_mapping_for_mult
  5. 2019春季学期第十一周作业
  6. Tomcat简单介绍
  7. idea 2018.1 for mac JRebel破解
  8. 父组件传递值给子组件(一)
  9. 【原创】tarjan算法初步(强连通子图缩点)
  10. 关于微信小程序下拉出现三个小点