java23中设计模式(1)-facade(门面,外观)模式
java23中设计模式(1)-facade(门面,外观)模式
写在前面
学习java以来不断听到各种设计模式,各种框架也大量使用模式
面试的时候曾经也被问过关于设计模式的问题,但是一直没有
系统的了解学习过相关知识,在此,将从书中,博客中学到的知识
做一次自我归纳和总结,也为温故知新做好准备材料.
情景设想
假设你需要造一个房子,房子简单的分为地基建设、主体建
设、内部装潢三部(简单例子,不做深究),你分别找到了这么几个
施工团队:
* 黑曜石地基团队 *:用黑曜石打地基的团队
* 白石英主体团队 *:用白石英打造房子主体的团队
* 红石内饰团队 *:用红石打造房子内部装潢的团队
房子如下:
public class House{private String subgrade;//地基private String body;//主体private String ornament;//装饰//省略getter/setter.....}
三个团队如下:
public class ObsidianTeam{public buildSubgrade(House house){house.setSubgrade("黑曜石地基");}}
public class QuartzTeam{public buildBody(House house){house.setBody("白石英主体");}}
public class RedStoneTeam{public buildOrnament(House house){house.setOrnament("红石内饰");}}
当我们不考虑设计模式的时候,造房子的流程是这样的
public class BuildTest{public static void main(String[] args){//你找来了黑曜石团队ObsidianTeam obsidianTeam = new ObsidianTeam();//你找来了白石英团队QuartzTeam quartzTeam = new QuartzTeam();//你找来了红石内饰团队RedStoneTeam redStoneTeam = new RedStoneTeam();//你的房子House house = new House();//黑曜石团队为你的房子建好了地基obsidianTeam.buildSubgrade(house);//白石英团队为你的房子建好了主体quartzTeam.buildBody(house);//红石内饰团队装饰了你的房子redStoneTeam.buildOrnament(house);//看看你的房子System.out.println("一幢有着"+house.getSubgrade()+","+house.getBody+","+house.getOrnament+"的房子!");}}
结果:
一幢有着黑曜石地基,白石英主体,红石内饰的房子!
可以看出,这种编程有很多问题:
1.程序暴露了过多的细节(不涉及用户交互的方法),例如三个团队的建设方法,以及可能更加复杂但是没有写出来的其他方法:三个团队互相商量房子的衔接处的处理等等…
2.当步骤增多的时候,越加难以维护,不够系统
当我们使用facade模式时,我们的代码可以改成这样
这三个团队组成了一个施工团队:
public class BuildTeam{private static BuildTeam buildTeam = null;private ObsidianTeam obsidianTeam = null;private QuartzTeam quartzTeam = null;private RedStoneTeam redStoneTeam = null;//私有化构造方法,单例private BuildTeam(){obsidianTeam = new ObsidianTeam();quartzTeam = new QuartzTeam();redStoneTeam = new RedStoneTeam();}//获取施工团队单例public static BuildTeam getInstance(){synchronized(BuildTeam.class){if(buildTeam == null){buildTeam = new BuildTeam();}return buildTeam;}}//建造一幢房子public void buildHouse(House house){//调用黑曜石团队为房子建好了地基obsidianTeam.buildSubgrade(house);//调用白石英团队为房子建好了主体quartzTeam.buildBody(house);//调用红石内饰团队装饰了的房子redStoneTeam.buildOrnament(house);}}
现在,你建造房子的过程变成了这样
public class BuildTest{public static void main(String[] args){//你的房子House house = new House();//找来施工团队BuildTeam buildTeam = BuildTeam.getInstance();//施工团队建造房子buildTeam.buildHouse(house);//看看你的房子System.out.println("一幢有着"+house.getSubgrade()+","+house.getBody+","+house.getOrnament+"的房子!");}}
运行结果和之前相同
对比两种方案:
1.前一种方案所有的非交互方法都对用户暴露,远没有后面一种由门面提供统一的接口方法简单
2.前一种的方案提供了更多的可定制的可能,你可以找到黑曜石,青砖,灰瓦各种团队相互组合为你完成你的房子,当然后一种将团队抽象之后也能实现
java23中设计模式(1)-facade(门面,外观)模式相关推荐
- 结构型模式(五)门面模式(Facade Pattern 外观模式)
一.模式定义 门面模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统 ...
- 带你认识4种设计模式:代理模式、装饰模式、外观模式和享元模式
摘要:本文我们主要介绍结构型模式中的代理模式.装饰模式.外观模式和享元模式. 本文分享自华为云社区<快来,这里有23种设计模式的Go语言实现(三)>,原文作者:元闰子 . 设计模式(Des ...
- 6中结构型设计模式的对比理解(Composite组合模式,Proxy代理模式,Flyweight享元模式,Facade门面模式,Bridge桥接模式,Decorator装饰器模式)
结构型模式 结构型模式用来组装 类和对象,以获得更大的结构. 结构型类模式,通过继承机制来组合接口或类.简单的例子就是多重继承,最后一个类拥有所有父类的性质.这个模式有助于独立开发一个协同类.另一个例 ...
- 用最简单的例子说明设计模式(一)之单例模式、工厂模式、装饰模式、外观模式...
设计模式 所谓设计模式,就是一套被反复使用的代码设计经验的总结(情境中一个问题经过证实的一个解决方案).使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.设计模式使人们可以更加简单 ...
- 代理模式vs适配器模式vs外观模式
一.定义 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. 适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口,使得原本接口不兼容而不能一起工作的那些类可以 ...
- 设计模式——门面(外观)模式
一般设计一个复杂的系统的时候,常常将整个系统按照功能划分为几个子系统:这样便于开发,也便于形成比较清晰的架构. 但对于使用者来说,如果需要了解各个系统的功能,则不是一件很简单的事情!这时候提供一个了解 ...
- Java23中设计模式(Design Patterns)详解
2019独角兽企业重金招聘Python工程师标准>>> 设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复 ...
- 外观模式(Facade)
外观模式(Facade) 外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合 ...
- 设计模式之【外观模式-Facade】
外观模式(Facade) 外观模式是为了解决类与类之家的依赖关系的 像spring一样,可以将类和类之间的关系配置到配置文件中 而外观模式就是将他们的关系放在一个Facade类中 降低了类类之间的耦合 ...
最新文章
- 匹配3位或4位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔...
- 谷歌助力,快速实现 Java 应用容器化
- (0002) iOS 开发之开发者iOS 10 正式版体验报告
- 20145321 《Java程序设计》第7周学习总结
- 【笔记】基于边缘检测和BP神经网络的大豆杂草识别研究
- Oracle中table函数的应用
- 服务器内存型号与频率,一张图看懂如何选择DDR4内存的频率和容量
- Oracle GoldenGate For Big Data - Kafka Handler
- 基于FPGA实现IIC接口(EEPROM)
- Netty工作笔记0076---handler链调用机制实例3
- SQL Server 2008 R2 中英文 开发版/企业版/标准版 链接地址
- MCMC蒙特卡洛算法
- sql server 2012序列号密钥sql server 2012序列号sql密钥
- python源代码编译后的文件扩展名-python源代码被解释器转换后的格式是什么?
- windows下red5配置
- Jupyter notebook中自定义支持天软TSl语言的魔术命令
- 银行,金融行业的清分,结算,清算,核算到底是什么含义? 现金需要搬运么?
- android系统文件重命名文件格式,安卓手机上文件的后缀名怎么改?
- Hyper-V虚拟机安装Linux后修改Linux的屏幕分辨率
- 【JavaWeb】JavaWeb与JavaWeb技术栈
热门文章
- 山东理工大学matlab考试,山东理工大学汽车理论课程设计MATLAb程序
- 20200521,看到Java的爱情我羡慕了...
- Apache Hadoop Pig 源代码分析(2)
- 全方位了解IC芯片测试流程,IC芯片自动化测试平台分享
- 渲染静态页面、get请求、post请求、express框架、路由、中间件
- IDEA复制已有项目为新项目——笔记
- 新奇老师java纯小白入门_推荐一篇为纯小白同学准备的Java教程,从仓颉造字开始学...
- 关于VHDL的IF,CASE语句用法
- 目标检测 -- R-CNN,Fast R-CNN,Faster R-CNN
- IBM、康宁、道琼斯、万科、小米、oppo、东风汽车等公司高管变动