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(门面,外观)模式相关推荐

  1. 结构型模式(五)门面模式(Facade Pattern 外观模式)

    一.模式定义 门面模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统 ...

  2. 带你认识4种设计模式:代理模式、装饰模式、外观模式和享元模式

    摘要:本文我们主要介绍结构型模式中的代理模式.装饰模式.外观模式和享元模式. 本文分享自华为云社区<快来,这里有23种设计模式的Go语言实现(三)>,原文作者:元闰子 . 设计模式(Des ...

  3. 6中结构型设计模式的对比理解(Composite组合模式,Proxy代理模式,Flyweight享元模式,Facade门面模式,Bridge桥接模式,Decorator装饰器模式)

    结构型模式 结构型模式用来组装 类和对象,以获得更大的结构. 结构型类模式,通过继承机制来组合接口或类.简单的例子就是多重继承,最后一个类拥有所有父类的性质.这个模式有助于独立开发一个协同类.另一个例 ...

  4. 用最简单的例子说明设计模式(一)之单例模式、工厂模式、装饰模式、外观模式...

    设计模式 所谓设计模式,就是一套被反复使用的代码设计经验的总结(情境中一个问题经过证实的一个解决方案).使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.设计模式使人们可以更加简单 ...

  5. 代理模式vs适配器模式vs外观模式

    一.定义 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. 适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口,使得原本接口不兼容而不能一起工作的那些类可以 ...

  6. 设计模式——门面(外观)模式

    一般设计一个复杂的系统的时候,常常将整个系统按照功能划分为几个子系统:这样便于开发,也便于形成比较清晰的架构. 但对于使用者来说,如果需要了解各个系统的功能,则不是一件很简单的事情!这时候提供一个了解 ...

  7. Java23中设计模式(Design Patterns)详解

    2019独角兽企业重金招聘Python工程师标准>>> 设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复 ...

  8. 外观模式(Facade)

    外观模式(Facade) 外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合 ...

  9. 设计模式之【外观模式-Facade】

    外观模式(Facade) 外观模式是为了解决类与类之家的依赖关系的 像spring一样,可以将类和类之间的关系配置到配置文件中 而外观模式就是将他们的关系放在一个Facade类中 降低了类类之间的耦合 ...

最新文章

  1. 匹配3位或4位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔...
  2. 谷歌助力,快速实现 Java 应用容器化
  3. (0002) iOS 开发之开发者iOS 10 正式版体验报告
  4. 20145321 《Java程序设计》第7周学习总结
  5. 【笔记】基于边缘检测和BP神经网络的大豆杂草识别研究
  6. Oracle中table函数的应用
  7. 服务器内存型号与频率,一张图看懂如何选择DDR4内存的频率和容量
  8. Oracle GoldenGate For Big Data - Kafka Handler
  9. 基于FPGA实现IIC接口(EEPROM)
  10. Netty工作笔记0076---handler链调用机制实例3
  11. SQL Server 2008 R2 中英文 开发版/企业版/标准版 链接地址
  12. MCMC蒙特卡洛算法
  13. sql server 2012序列号密钥sql server 2012序列号sql密钥
  14. python源代码编译后的文件扩展名-python源代码被解释器转换后的格式是什么?
  15. windows下red5配置
  16. Jupyter notebook中自定义支持天软TSl语言的魔术命令
  17. 银行,金融行业的清分,结算,清算,核算到底是什么含义? 现金需要搬运么?
  18. android系统文件重命名文件格式,安卓手机上文件的后缀名怎么改?
  19. Hyper-V虚拟机安装Linux后修改Linux的屏幕分辨率
  20. 【JavaWeb】JavaWeb与JavaWeb技术栈

热门文章

  1. 山东理工大学matlab考试,山东理工大学汽车理论课程设计MATLAb程序
  2. 20200521,看到Java的爱情我羡慕了...
  3. Apache Hadoop Pig 源代码分析(2)
  4. 全方位了解IC芯片测试流程,IC芯片自动化测试平台分享
  5. 渲染静态页面、get请求、post请求、express框架、路由、中间件
  6. IDEA复制已有项目为新项目——笔记
  7. 新奇老师java纯小白入门_推荐一篇为纯小白同学准备的Java教程,从仓颉造字开始学...
  8. 关于VHDL的IF,CASE语句用法
  9. 目标检测 -- R-CNN,Fast R-CNN,Faster R-CNN
  10. IBM、康宁、道琼斯、万科、小米、oppo、东风汽车等公司高管变动