本文源码: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. C#设计模式(11)——外观模式(Facade Pattern)

    一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ...

  2. 设计模式之 外观模式详解(Service第三者插足,让action与dao分手)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 各位好,LZ今天给各位分享一 ...

  3. 北风设计模式课程---外观模式(Facade)总结

    北风设计模式课程---外观模式(Facade)总结 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 设计模式都是对生活的抽象,比如用户获得装备,我可以先装备 ...

  4. python设计模式之外观模式

    python设计模式之外观模式 系统会随着演化变得非常复杂,最终形成大量的(并且有时是令人迷惑的)类和交互,这种情况并不少见.许多情况下,我们并不想把这种复杂性暴露给客户端.外观设计模式有助于隐藏系统 ...

  5. 每天一个设计模式-2 外观模式(Facade)

    每天一个设计模式-2  外观模式(Facade) 1.生活中的示例 客户想要购买一台电脑,一般有两种方法: 1.自己DIY,客户需要知道组成电脑的所有电子器件,并且需要熟悉那些配件,对客户要求较高. ...

  6. 乐在其中设计模式(C#) - 外观模式(Facade Pattern)

    原文:乐在其中设计模式(C#) - 外观模式(Facade Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 外观模式(Facade Pattern) 作者:webabcd 介绍 ...

  7. 8.4 GOF设计模式三: 外观模式 Facade

    GOF设计模式三: 外观模式 Facade  “现有系统”功能强大.复杂,开发“新系统”需要用到其中一部分,但又要增加一部 分新功能,该怎么办?4.1 Facade Pattern: Key Fea ...

  8. js设计模式——2.外观模式

    js设计模式——2.外观模式

  9. Java设计模式12:常用设计模式之外观模式(结构型模式)

    1. Java之外观模式(Facade Pattern) (1)概述:       现代的软件系统都是比较复杂的,设计师处理复杂系统的一个常见方法便是将其"分而治之",把一个系统划 ...

随机推荐

  1. 面试连环炮系列(二十一):你们的项目怎么使用kafka

    你们的项目怎么使用kafka? 我们采用kafka进行日志采集,准确点说是ELK方案,即elasticsearch + logstash + kibana + kafka.通过Spring AOP的方 ...

  2. HttpRunner学习9--切换测试报告模板

    前言 在HttpRunner中,给我们提供了 2 套测试报告模板,分别是 default_report_template.html 和 extent_report_template.html . 默认 ...

  3. VS2017 无法修改代码编辑区的项背景颜色问题

    以前都是好好的,安装  ClaudiaIDE: https://github.com/buchizo/ClaudiaIDE 之后也没啥问题,用着用着代码编辑区自定义的颜色就没有了,好几台电脑都是这样, ...

  4. Maven——向Maven本地仓库中手动添加依赖包(ps:ojdbc.jar)

    maven中央仓库中并非包含所有现有的依赖包和插件,部分依赖包和插件需要手动地进行添加(如ojdbc.jar) 一.添加JDK系统环境变量(maven是基于Java的,可参考:https://www. ...

  5. Cross-Site Scripting:DOM 跨站点脚本:DOM

  6. C#_.NetCore_Web项目_EXCEL数据导出(ExcelHelper_第一版)

    项目需要引用NPOI的Nuget包:DotNetCore.NPOI-v1.2.2 A-前端触发下载Excel的方法有三种: 1-JS-Url跳转请求-后台需要返回文件流数据: window.Locat ...

  7. SpringBoot 项目运行在 tomcat7 上

    SpringBoot 项目如何打成 war 包 SpringBoot项目的默认打包方式是将工程打包成为一个 jar 包.部分情况下,我们需要将项目打包成一个 war 包,以方便我们将工程部署在 tom ...

  8. Python如何运行程序

    人生苦短,我用Python. 作为一个开发人员,如何写代码是必须要知道的,代码如何运行也是有必要了解的.通过了解代码如何运行,可指导我们写出效率更高的代码.下午看了<Python学习手册> ...

  9. JavaScript 日期格式

    有四种 JavaScript 日期输入格式: 类型 实例 ISO 日期 "2018-02-19" (国际标准) 短日期 "02/19/2018" 或者 &quo ...

  10. SAP QM 检验批里某检验特性的取样数量跟检验计划设置不符?

    SAP QM 检验批里某检验特性的取样数量跟检验计划设置不符? 如下检验批号 890000045939, 结果录入界面,第二个特性里,取样数量是50个.实际上,该检验批对应的检验计划里, 采样过程L- ...