Java描述设计模式(12):外观模式
本文源码: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):外观模式相关推荐
- Java描述设计模式(05):原型模式
一.原型模式简介 1.基础概念 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. 2.模式结构 原型模式要求对象实现一个 ...
- 设计模式之外观模式php,PHP设计模式:外观模式
前言 菜鸟教程对外观模式的描述是:外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口, ...
- 研磨设计模式之外观模式(Facade)(解决方案)
3.2 解决方案 3.2.1 外观模式来解决 用来解决上述问题的一个合理的解决方案就是外观模式.那么什么是外观模式呢? (1)外观模式定义 这里先对两个词进行一下说明,一个是界面,一个是接口. 界 ...
- JS常用的设计模式(7)—— 外观模式
JS常用的设计模式(7)-- 外观模式 外观模式(门面模式),是一种相对简单而又无处不在的模式.外观模式提供一个高层接口,这个接口使得客户端或子系统更加方便调用. 用一段再简单不过的代码来表示 var ...
- Swift 中的设计模式 #3 外观模式与适配器模式
作者:Andrew Jaffee,原文链接,原文日期:2018-09-04 译者:郑一一:校对:BigNerdCoding,pmst,Forelax:定稿:Forelax 本文是我的设计模式系列教程的 ...
- 初学Java常用设计模式之——原型模式
声明:转载请附上原文链接 提示:标题序号从3开始,是照应不同设计模式笔记发布的顺序而定的,比如,第上一篇文章 初学Java常用设计模式之--工厂模式 序号从2开始. 标题后面之所以加上了解,是因为相对 ...
- Javascript 设计模式之外观模式【讲师辅导】-曾亮-专题视频课程
Javascript 设计模式之外观模式[讲师辅导]-770人已学习 课程介绍 随着 javascript ES6/7 的发布,很多老版本的设计模式的实现,今天来看是错误的,将被彻底. ...
- 设计模式之外观模式(九)
目录 1. 背景 1.1 问题描述 1.2 外观模式简介 2. 外观模式 2.1 外观模式解决上述问题 2.2 外观模式在mybatis框架应用的源码分析 1. 背景 1.1 问题描述 组建一个家庭影 ...
- 移动开发 | Swift 中的设计模式 #3 外观模式与适配器模式
本文是我的设计模式系列教程的第三篇.在第一篇文章中,我介绍了 创建型模式中的工厂模式和单例模式.在第二篇文章中,又讨论了一下 行为型模式中的观察者模式和备忘录模式. 在本文中,我会就结构型模式中的外观 ...
最新文章
- spring中间scope详细解释
- Windows Server应用之32位系统如何安装64位打印机驱动
- linux用8m内存读取1g日志,检查 Linux 中内存使用状况的 8 条命令
- android 默认浏览器 视频播放 二维码,Android调用系统默认浏览器访问的方法
- 小扎展示Facebook十年产品路线图,跳票的智能音箱又有新爆料
- 【前端】数组元素过滤
- web前端人事面试常问问题
- YiDB在翼支付账单业务的应用实践
- 植物大战僵尸 修改存档和金钱
- android opengl 简书,Android OpenGL入门
- 400 行 C 代码实现一个虚拟机
- Centos下安装桌面环境和Flash插件
- HTTP/1.1(消息格式、连接管理、条件请求、范围请求、缓存、身份验证)
- Multiple PDN Connectivity
- R语言统计入门第六章——回归与相关性
- 手机adb调试出现Not running as root. Try“adb root“ first.
- 关于深度论坛进不去的原因
- 关于高斯光学的一些知识
- 【TMT数据传不到MES中间库】-F18
- 2021牛年的春节一个人过
热门文章
- (数据库系统概论|王珊)第十章数据库恢复技术-第四、五、六、七节:数据库恢复技术和数据库镜像
- Linux下安装Octave
- golang日志输出
- 《论文笔记》Adaptive decentralised_cooperative_vision_based_simultaneous_localization_and_mapping_for_mult
- 2019春季学期第十一周作业
- Tomcat简单介绍
- idea 2018.1 for mac JRebel破解
- 父组件传递值给子组件(一)
- 【原创】tarjan算法初步(强连通子图缩点)
- 关于微信小程序下拉出现三个小点