被说了很多遍的设计模式---外观模式
[把你的理性思维慢慢变成条件反射]
本文,我们讲介绍外观模式,文章主题结构与上文一致。惯例,先来看看我们示例工程的环境:
经典问题:
代理商,中间商,第三方中介等功能整合性应用。本文以“装修公司”为例说明。
思路分析:
示例工程:
错误写法:
package com.csdn.ingo.gof_Facade;public class DecorativeMaterials1 {public void select() {System.out.println("select DecorativeMaterials1");}public void buy() {System.out.println("buy DecorativeMaterials1");}
}
package com.csdn.ingo.gof_Facade;public class Window {public static void main(String[] args) {DecorativeMaterials1 dm1 = new DecorativeMaterials1();DecorativeMaterials2 dm2 = new DecorativeMaterials2();DecorativeMaterials3 dm3 = new DecorativeMaterials3();DecorativeMaterials4 dm4 = new DecorativeMaterials4();dm1.select();dm2.select();dm3.select();dm4.select();dm1.buy();dm2.buy();dm3.buy();dm4.buy();}
}
错误原因:
调用方需要逐一调用被动方的工程,承担了过多职责。代码书写方式过于臃肿。
推荐写法:
创建DecorateCompany.java文件,具体内容如下:
package com.csdn.ingo.gof_Facade.one;public class DecorateCompany {DecorativeMaterials1 dm1;DecorativeMaterials2 dm2;DecorativeMaterials3 dm3;DecorativeMaterials4 dm4;public DecorateCompany() {dm1 = new DecorativeMaterials1();dm2 = new DecorativeMaterials2();dm3 = new DecorativeMaterials3();dm4 = new DecorativeMaterials4();}public void buy(){dm1.buy();dm2.buy();dm3.buy();dm4.buy();}public void select(){dm1.select();dm2.select();dm3.select();dm4.select();}
}
创建DecorativeMaterials1.java,DecorativeMaterials2.java,DecorativeMaterials3.java,DecorativeMaterials4.java四个文件,具体内容如下:
package com.csdn.ingo.gof_Facade.one;public class DecorativeMaterials1 {public void select() {System.out.println("select DecorativeMaterials1");}public void buy() {System.out.println("buy DecorativeMaterials1");}
}
创建Window.java文件,具体内容如下:
package com.csdn.ingo.gof_Facade.one;public class Window {public static void main(String[] args) {DecorateCompany dc = new DecorateCompany();dc.select();dc.buy();}
}
推荐原因:
在没有改变原有每个对象的独立性的同事,实现对客户端的功能屏蔽,向调用方暴露简洁统一的调用接口,达到完整的功能。
模式总结:
标准外观模式UML结构图:
模式总结:
外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
组成部分:Facade(外观抽象类),SubSystem*(具体子系统)两大部分组成。
特别提醒:这里的子系统是一个广义概念,它可以是一个类,模块,甚至是一个系统。
模板功能扩展:
由结构图可以看出Facade只有一个,其他所有SubSystem都继承,实现该类。但是在某些场景下,只有一个外观类,其在接口数量上可能是不够在场景中使用的。因此,作为扩展,我们可以在Facade之上,再抽象出一个抽象类,供客户端使用,这种效果,类似于多次继承。
反思:
应用场景:
- 在设计一开始需要考虑分层设计时,在层与层之间建立。
- 在开发过程中,随着模型的不断重构,精炼,适当引入,能够帮助实现更加简洁优化的代码实现。
- 对已经有的功能,进行封装,维护等等。
- 为当前系统向外提供统一的,简单的功能接口时。
- 为减少各个组件之间的耦合关系时。
优点:
- 屏蔽了子系统的实现细节与过程,有效优化了客户端的调用。
- 降低了各个组件之间的耦合关系,同事不影响客户端的功能使用。
缺点:
- 过多的屏蔽,可能会导致客户端的灵活性降低。
- Facade抽象类需要精心设计,可能出现随着功能需求演进,需要新功能加入时,可能违背“开闭原则”,修改Facade抽象类的可能。
-------------------------------------------------------------------------------------------------------------------------------------
至此,被说了很多遍的设计模式---外观模式 结束
参考资料:
图书:《大话设计模式》
其他博文:http://blog.csdn.NET/lovelion/article/details/7563445
被说了很多遍的设计模式---外观模式相关推荐
- 被说了很多遍的设计模式---单例模式
[把你的理性思维慢慢变成条件反射] 本文,我们讲介绍单例模式,文章主题结构与上文一致.惯例,先来看看我们示例工程的环境: 操作系统:win7 x64 其他软件:eclipse mars,jdk8 -- ...
- Python设计模式-外观模式
Python设计模式-外观模式 代码基于3.5.2,代码如下; #coding:utf-8 # 外观模式class AlarmSensor:def run(self):print("Alar ...
- 设计模式--------外观模式
设计模式--------外观模式 介绍外观模式的四大问题 现在的写法有什么问题吗? 为什么要用外观模式? 什么是外观模式? 外观模式有什么好处? 使用一个例子进行问题的说明 假如要制作一个智能系统,要 ...
- [设计模式]外观模式
1. 定义 外观模式 提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更加容易使用. 外观不仅简化了系统内接口的使用,也将客户从组件中的子系统中解耦,外观和适配器都可 ...
- Java 设计模式——外观模式
概述 今天要说的外观模式是一个相对简单的设计模式,而且在日常的开发中,可能你也会时常使用它,只是你可能并未想过这是一个设计模式.本文会从一些实例着手,来对本文要说明的外观模式进行尽可能全面的讲解.希望 ...
- 大话设计模式—外观模式
外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这种模式涉及 ...
- 大话设计模式——外观模式
股民炒股代码 /*** 股票1*/ public class Stock1 {// 卖股票public void sell() {System.out.println("股票1卖出" ...
- 设计模式 | 外观模式及典型应用
前言 本文的主要内容: 介绍外观模式 示例 自己泡茶 到茶馆喝茶 外观模式总结 外观模式的典型应用 spring JDBC 中的外观模式 Mybatis中的外观模式 Tomcat 中的外观模式 SLF ...
- java 外观模式类图_Java 设计模式——外观模式
概述 今天要说的外观模式是一个相对简单的设计模式,而且在日常的开发中,可能你也会时常使用它,只是你可能并未想过这是一个设计模式.本文会从一些实例着手,来对本文要说明的外观模式进行尽可能全面的讲解.希望 ...
- 2.进阶--研磨设计模式----外观模式
1.外观模式: 作用或者优点: 为某个系统的组合功能提供一个外层,也就是客户端使用系统的某个组合功能(需要与多个子模块交互)时候,可以通过提供一个外层,来避免客户端对子模块复杂的调用,简化了客户端的使 ...
最新文章
- android屏幕分享软件,ScreenStream(屏幕分享)
- iOS功能-统计平均下班时间
- Java 线程池中的线程复用是如何实现的?
- python字节码大全
- ABAP销售合同冻结Bapi
- ORACLE 11G DATA GUARD主从切换
- thinkpad t460p恢复原厂系统以及设置的方式
- 关闭mysql方法_启动和关闭MySQL的方法
- 经验与教训:测试员的偏向
- 别人问了个问题:有没有选择JAVA开发的设计文档
- 易语言卷帘菜单与json_易语言卷帘式菜单组件使用教程
- 超简单一行代码实现应用双开,仿照微信双开、QQ双开等实现app应用双开,即采用Android插件化开发在免安装情况下加载使用原生app
- 台达触摸屏和vfd-m变频器通讯控制监视程序 使用modbus rtu通讯方式,在触摸屏可以直接控制变频器
- 解决pr调用麦克风的问题
- 聚类算法评价指标python实现_聚类算法及其评估指标
- 实战 | 我是怎么定位问题的?
- 两个有序顺序表la,lb合并为lc(不删除重复)。
- ChinaSoft 论坛巡礼 | 软件缺陷的自动发现与修复
- Eclipse版本介绍
- 如何在线下载简历模板?手机上怎么下载简历?
热门文章
- 虚拟现实下的手势识别综述
- magicbook java开发,买前必看,荣耀MagicBook和华为MateBook D(2018版)哪个更适合你?
- 中职学校计算机大赛方案,中等职业学校电子技能赛的活动策划方案参考
- Google推荐的图片加载库Glide介绍
- 英文聊天常见地道简写
- 软件开发管理之:编码负责人及标准代码库机制(转)--有同样的想法
- 2、51单片机——I2C 总线
- matlab一维数组操作,Matlab创建一维数组的具体操作讲解
- SpringDataJPA使用Specification动态查询和分页
- Unity网格编程篇(三) 温度图、热力图