外观模式就类似于一个工具包,一个类对应一个功能。

外观模式的意图是为子系统提供一个接口,便于它的使用。

书中给出的例子是画一个哑弹的飞行路径, 初始的类的设计是这样的,看下图,

ShowFlight类存在一个问题:它混杂了三个功能:

  1. 为飞行路径提供一个面板
  2. 将飞行路径显示在面板中
  3. 计算飞行路径

ShowFlight类可以正常工作,但是考虑到之后我们会改变某些具体的功能,根据关注点分离的原则,我们应将其重构为多个单独的类,以提高可维护性以及可重用性。

我们可以做出如下改变:

  • 引入一个Function类,它定义了f()方法,接收一个double值(时间值),返回一个double值(函数的值,即坐标值)。
  • 将createTitledPanel()方法移到已存在的UI工具类中,来实现一个像当前ShowFlight类那样带有标题的面板。
  • 将ShowFlight类移入PlotPanel类,改为使用Function对象来获取x和y值。定义PlotPanel构造函数接收两个Function实例和绘图所需的点数。

类图设计如图所示,

main方法还是写在ShowFlight中,但是我们把它取名为ShowFlight2。Function类用来获取对应的x和y的坐标值。但是因为具体x和y是怎样的一个值,则由具体的问题决定。PlotPanel使用Function的实现方法获取到的x和y值来画图。UI类再得到画好图的PlotPanel引用,来创建一个有边框的JPanel。最后ShowFlight2生成一个frame,并使用UI类的方法得到完整的轨迹图界面(这里使用了单例设计模式,ShowFlight2类先得到了UI的单例,再调用方法)。

原来的ShowFlight类是一个示例程序,它可以直接运行,但是对子系统的功能无法复用;而经过重构后的外观类则是可配置、可重用的类,提供了高层次的接口,使得子系统的使用更加方便。

JAVA设计模式(DESIGN PATTERNS IN JAVA)读书摘要 第1部分接口型模式——第4章 外观(Facade)模式的更多相关文章

  1. Java设计模式(Design Patterns In Java)读书摘要——第1章 绪论

    为何需要模式 模式是做事的方法,是实现目标,研磨技术的方法.通俗点说,模式是为了解决某个行业的某个问题的有效的方法或技艺. 为何需要设计模式 为了提升代码的水准,是代码变得简洁而易用.模式是一种思想, ...

  2. 设计模式--外观(Facade)模式

    Insus.NET在去年有写过一篇<软件研发公司,外观设计模式(Facade)>http://www.cnblogs.com/insus/archive/2013/02/27/293606 ...

  3. 设计模式(Design Patterns)Java版

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  4. Examples of GoF Design Patterns in Java's core libraries

    设计模式分类 stackOverflow Structural(结构模式) Adapter:把一个接口或是类变成另外一种. java.util.Arrays#asList() javax.swing. ...

  5. 云设计模式-Design patterns for microservices

    云设计模式 https://azure.microsoft.com/zh-cn/blog/design-patterns-for-microservices/ https://www.cnblogs. ...

  6. 设计模式(Design Patterns)的简单讲解

    模式的诞生与定义 模式(Pattern)起源于建筑业而非软件业(小本本记下来--) 模式之父--美国加利佛尼亚大学环境结构中心研究所所长Christopher Alexander博士; 模式 : -C ...

  7. Java经典23结构模型的设计模式(三)------附加代理模式、适配器型号、Facade模式的差异

    本文介绍了7样的结构模型中的其余2种:轻量级.代理模式. 一.享元模式FlyWeight 享元模式比較简单且重要,在非常多场合都被用到.仅仅只是封装起来了用户看不到.其概念:运用共享内存技术最大限度的 ...

  8. Head First 设计模式 —— 08. 外观 (Facade) 模式

    思考题 想想看,你在 JavaAPI 中遇到过哪些外观,你还希望 Java 能够新增哪些外观? P262 println.log 日志接口.JDBC 接口 突然让想感觉想不出来,各种 API 都用得挺 ...

  9. 设计模式C++描述----14.外观(Facade)模式

    一. 举例说明 还以我以前做的文件系统(FileSys)为例: 文件系统是一个独立的系统,它提供一套核心的文件操作. 除了文件系统,还有四个子系统,分别是杀毒子系统(KillVirus),压缩子系统( ...

随机推荐

  1. 高效编程之cache命中对于程序性能的影响

    下面这个代码用两个双层循环遍历了一个二维数组里所有的元素,以我自己机器的测试 上面那个循环耗时基本为下面的一半,两个循环的时间复杂度相同,为什么会有这么大的差别? 首先要明白的是不管是几维数组,他们都 ...

  2. 使用 satis 搭建一个私有的 Composer 包仓库

    在我们的日常php开发中可能需要使用大量的composer包,大部份都可以直接使用,但在公司内部总有一小部份包是不能公开的,这时候我们就需要搭建一个公司内部使用的composer仓库,好在compos ...

  3. selenium python 定位一组对象

    为什么定位一组对象? 定位一组对象的思想    在定位一组对象的过程中我们如何实现?以前的都是通过具体的对象定位,那么定位一组我们就需要通过css来定位   在单个定位对象中使用的是find_elem ...

  4. 顺丰接口 api对接说明

    1       功能说明 物流轨迹查询-使用的物流单号和快递单号即可实现查询物流信息. 1.1   接口规则 (1).查询接口支持按照运单号查询(单个查询). (2).指定的物流运单号选择相应的快递公 ...

  5. Windows下memcache安装使用

    Windows下Memcache安装 随着时间的推移,网上现在能找到的在 Windows下安装 Memcache 的文档大多已经过时.雪峰这里再简要介绍一下当下最新版的安装和配置方法. Memcach ...

  6. 基于python3的手机号生成脚本

    今天利用业余,自己突发想法来写个手机号码生成的脚本,其实自己用的方法很简单,想必肯定又不少人写的比我的好,我只是自己闲来无聊搞一下, #作者:雷子 #qq:952943386 #日期:2016年7月1 ...

  7. IOS 设置定时器

    IOS 设置定时器  自动滚动视图 定时发送坐标信息 即时显示 时钟 NSTimer *timer; - (void)start {//1second 调用一次 timer = [NSTimer sc ...

  8. js中的命名规范

    在实际开发中规范的命名,不仅方便自己查看,理解变量的实际意义,而且在团队开发中也能提高开发效率. 下面将介绍javascript中的变量的命名规范: 1)首先,变量名要有实际意义,不建议使用单个的字母 ...

  9. Java中transient有何作用?

    transient关键字用来防止序列化域.如果一个引用类型被transient修饰,则其反序列化的结果是null.基本类型则为0.如果引用类型时不可序列化的类,则也应该使用transient修饰,它在 ...

  10. iphone开发之用lipo合并模拟器库和真机库,发布一个通用的静态库

    转载自:http://blog.csdn.net/arthurchenjs/article/details/6044616 lipo lipo –create Release-iphoneos/lib ...