facade设计模式
GOF 《设计模式》一书对 Facade 模式是这样描述的 :
为子系统中的一组接口提供一个统一接口。Facade模式定义了一个更高层的接口,使子系统更加容易使用。
大致意思是说:使用一种比原有方式更简单的办法与系统交互。例如,我们把一个很文件的文件,放在了第二抽屉里,而第二个抽屉的钥匙放在了第一个抽屉里,我们要想取出这个文件,第一步肯定要拿到第一个抽屉的钥匙,然后打开它再拿出第二个抽屉的钥匙,最后打开第二个抽屉取出文件。
我就上面说的那个情形写一下实现代码,首先我们要实现二个子系统,呵呵,把抽屉比喻成系统,有点夸张了(DrawerOne、DrawerTwo):
class DrawerOne {
public void open(){
System.out.println("第一个抽屉被打开了");
getKey();
}
public void getKey(){
System.out.println("得到第二个抽屉的钥匙");
}
}
class DrawerTwo{
public void open(){
System.out.println("第二个抽屉被打开了");
getFile();
}
public void getFile(){
System.out.println("得到这个重要文件");
}
}
public class Client{
public static void main(String []args){
DrawerOne darwerOne=new DrawerOne();
DrawerTwo darwerTwo=new DrawerTwo();
darwerOne.open();
darwerTwo.open();
}
}
由于没有使用Façade模式,可以看到要想得到这个文件要首先打开第一个抽屉,然后再打开第二个抽屉,在我们实际所开发的系统中,有时候客户要实现某一操作,并不需要知道实现这一操作的详细步骤,而是简单地点击某一个按钮就可以得到自己想要的结果。下面对上面的代码使用Façade模式进行改进,建立一个FacadeDrawer类:
class DrawerFacade{
DrawerOne darwerOne=new DrawerOne();
DrawerTwo darwerTwo=new DrawerTwo();
public void open(){
darwerOne.open();
darwerTwo.open();
}
}
修改Client类:
public class DrawerClient{
public static void main(String []args){
DrawerFacade drawer=new DrawerFacade();
drawer.open();
}
}
输出结果如下:
第一个抽屉被打开了
得到第二个抽屉的钥匙
第二个抽屉被打开了
得到这个重要文件
正如上面所说,客户端client,它并不需要关心子系统,而是关心DrawerFacade所留下来的和外部交互的接口,而子系统在DrawerFacade的聚合。
以上只是个人拙见,哪里有不正确的地方,希望大家多多批评指正。^_^
Facade模式主要适用于以下几种情况:
1) 不需要使用一个复杂系统的所有功能,而且可以创建一个新的类,包含访问系统的所有规则。如果只需要使用系统的部分功能,那么你为新类所创建的API将比原系统的API简单的多。
2) 希望封装或者隐藏系统原系统。
3) 希望使用原系统的功能,而且还希望增加一些新的功能。
4) 编写新类的成本小于所有人学会使用或者未来维护原系统上所需的成本。
facade设计模式相关推荐
- 外观模式(Facade)----设计模式
外观模式(Facade)----设计模式 文章目录 外观模式(Facade)----设计模式 什么是外观模式呢? 外观模式的基本介绍 制造一个影院管理? 实现代码 总结 什么是外观模式呢? 以我们中常 ...
- 设计模式--门面(Facade)模式
模式定义 为子系统中的一组接口提供一个一致(稳定)的界面,Facade模式定义了一个高层接口,这个接口使得这个子系统更加容易使用(复用) 类图 应用场景 1.当你需要使用复杂子系统的有限但直接的接口时 ...
- 设计模式学习笔记——外观(Facade)模式
设计模式学习笔记--外观(Facade)模式 @(设计模式)[设计模式, 外观模式, facade] 设计模式学习笔记外观Facade模式 基本介绍 外观案例 类图 实现代码 Database类 ma ...
- [设计模式-结构型]外观模式(Facade)
概括 名称 Facade 结构 动机 为子系统中的一组接口提供一个一致的界面,F a c a d e 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 适用性 当你要为一个复杂子系统提供一 ...
- 设计模式10: Facade 外观模式(结构型模式)
Facade 外观模式(结构型模式) 系统的复杂度 假设我们要开发一个坦克模式系统用于模拟坦克车在各种作战环境中的行为,其中坦克系统由引擎.控制器.车轮.车身等各个子系统构成. internal cl ...
- 门面设计模式(Facade Pattern)
GOF设计模式 Facade Pattern 门面设计模式 门面模式例子:我有一个专业的Nikon相机,我就喜欢自己手动调光圈.快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会.幸好相机 ...
- 23 种设计模式的通俗解释
点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 来源 | 肥朝 01 工厂方法 追 MM 少不了请吃饭了,麦 ...
- Java 23种设计模式有趣见解、总结
在网络上流畅很广的一篇旧文,暂时没找到原作者,目前所看到的最早转载时间是 2005年2月2日.作者用轻松的语言,形象解释了 23 种模式,有很好的启发作用. 创建型模式 1.FACTORY-追MM少不 ...
- 23种设计模式MM版形象描述
2019独角兽企业重金招聘Python工程师标准>>> 设计模式最难的莫过于不好理解,要是有个形象的例子就好了. 想要经一步学习,还是去买本sun公司的java design pat ...
最新文章
- 2022-2028年中国女式西装行业研究及前瞻分析报告
- Google新WorldSense预告片:独立VR
- 009_JSONFunction对象
- win32文件读写demo
- 同班同学20年后 身家15亿与月薪5000元的区别
- 【Tiny4412】烧写Android系统remote data too large问题分析和解决
- redhat7.0配置网卡
- SAP 2019 TechEd Key Note解读:云时代下SAP从业人员如何做二次开发?
- Tomcat 的 DefaultServlet
- linux wc read,Linux 下使用 wc 统计文件夹下所有文件的代码行数(包括子目录)-Go语言中文社区...
- MyBatis的概述及使用
- Android万能使用WebServices(不用引入外部包)
- Java数字转换大写
- Cnetos linux镜像全版本2.X、3.X、4.X、5.X、6.X、7.X、8.X
- 使用Python绘制热图的库 pyHeatMap 使用Python绘制热图的库 pyHeatMap
- WindowsLiveWriter安装步骤
- 用python做头像_如何利用python制作微信好友头像照片墙?
- 涂抹式水光针的使用方法你知道吗?
- 机器学习(五)logistic回归
- Debian安装谷歌浏览器(Google Chrome)