【JAVA设计模式】外观模式(Facade Pattern)
一 定义
二 案例
三 未使用模式情况
/**
* @Description A模块
* @author jerry
* @date 2016年4月11日下午2:16:04
*/
public interface AModuleApi {
public void a1(); //此方法主要用于外部调用
public void a2(); //下面双方法主要用于子系统内部间调用
public void a3();
}
/**
* @Description A模块实现
* @author jerry
* @date 2016年4月11日下午2:17:10
*/
public class AModuleImpl implements AModuleApi { @Override
public void a1() {
System.out.println("调用了A模块");
} @Override
public void a2() {
//TODO 主要用于子模块间互相调用
} @Override
public void a3() {
//TODO 主要用于子模块间互相调用
}
}
/**
* @Description B模块
* @author jerry
* @date 2016年4月11日下午2:16:12
*/
public interface BModuleApi {
public void b1(); //此方法主要用于外部调用
public void b2(); //下面双方法主要用于子系统内部间调用
public void b3();
}
/**
* @Description B模块实现
* @author jerry
* @date 2016年4月11日下午2:17:10
*/
public class BModuleImpl implements BModuleApi { @Override
public void b1() {
System.out.println("调用了B模块");
} @Override
public void b2() {
//TODO 主要用于子模块间互相调用
} @Override
public void b3() {
//TODO 主要用于子模块间互相调用
}
}
同理。C模块也是如此,篇幅原因。这里不贴代码了,须要代码能够从我github下clone,文末会给出地址。
public class Client { public static void main(String[] args) {
AModuleApi a = new AModuleImpl();
a.a1();
BModuleApi b = new BModuleImpl();
b.b1();
CModuleApi c = new CModuleImpl();
c.c1();
}
}
相信非常easy能够写出这种代码。
细致想想能够发现,假设这样写。会存在例如以下问题:
- 代码耦合度太高,client与子系统中各模块都有关联。一旦子系统有什么更改,会涉及到client的改动。
- 对client学习成本太高。client须要学习各个模块中每一个public方法。知道其什么含义后才干进行调用。
四 使用模式的情况
/**
* @Description 外观类,通常设计成单例
* @author jerry
* @date 2016年4月11日下午2:43:26
*/
public class Facade {
private Facade(){} public static void test(){
AModuleApi a = new AModuleImpl();
a.a1();
BModuleApi b = new BModuleImpl();
b.b1();
CModuleApi c = new CModuleImpl();
c.c1();
}
}
public class Client { public static void main(String[] args) {
// AModuleApi a = new AModuleImpl();
// a.a1();
// BModuleApi b = new BModuleImpl();
// b.b1();
// CModuleApi c = new CModuleImpl();
// c.c1(); Facade.test();
}
}
这样一来。client仅仅要与外观类打交道就可以,从而更好地实现了client和子系统各模块的耦合性。
当然有时你会有这种需求,client可能仅仅须要调用两个模块就可以,那么现有的外观模式就无法使用了,仅仅好绕开外观类。直接找各模块进行调用。此外,你是否发现。我的ABC模块里面除了有供外部调用的方法外。还有各模块间互相调用的方法,这些方法本不须要client了解。暴露了过多内部细节。会让client产生疑惑,这就是“接口污染”
。要解决问题,我们能够将Facade类定义为接口,并对事实上现,使用工厂模式对其创建实例,例如以下所看到的:
public interface FacadeApi {
public void a1();
public void b1();
public void c1(); /**
* @Description 原有方法,将各模块方法组合调用
* @return void
* @throws
*/
public void test();
}
/**
* @Description 外观接口实现
* @author jerry
* @date 2016年4月11日下午3:19:25
*/
public class FacadeImpl implements FacadeApi { @Override
public void a1() {
new AModuleImpl().a1();
} @Override
public void b1() {
new BModuleImpl().b1();
} @Override
public void c1() {
new CModuleImpl().c1();
} @Override
public void test() {
a1();
b1();
c1();
}
}
/**
* @Description 外观接口实现
* @author jerry
* @date 2016年4月11日下午3:19:25
*/
public class FacadeImpl implements FacadeApi { @Override
public void a1() {
new AModuleImpl().a1();
} @Override
public void b1() {
new BModuleImpl().b1();
} @Override
public void c1() {
new CModuleImpl().c1();
} @Override
public void test() {
a1();
b1();
c1();
}
}
public class Client { public static void main(String[] args) {
// AModuleApi a = new AModuleImpl();
// a.a1();
// BModuleApi b = new BModuleImpl();
// b.b1();
// CModuleApi c = new CModuleImpl();
// c.c1(); // Facade.test(); FacadeApi api = Factory.createFacade();
api.test();
}
}
这样以后,就对client降低了模块内部方法的暴露。
五 总结
- 假设你希望为一个复杂的子系统提供一个简单接口
- 假设构建多层结构的系统。能够考虑使用外观模式,使用外观对象作为每层的入口,这样能够简化层间调用,能够减少耦合度。
Reference:《研磨设计模式》
【JAVA设计模式】外观模式(Facade Pattern)的更多相关文章
- C#设计模式——外观模式(Facade Pattern)
一.概述 在系统设计中,某一个系统可能非常庞大,用户要使用该系统就不得不掌握大量的接口,造成使用的不便.这时可以考虑将该系统细分成一系列子系统并使子系统间的耦合降到最低,利用外观模式提供一个外观对象, ...
- 乐在其中设计模式(C#) - 外观模式(Facade Pattern)
原文:乐在其中设计模式(C#) - 外观模式(Facade Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 外观模式(Facade Pattern) 作者:webabcd 介绍 ...
- 设计模式系列之外观模式(Facade Pattern)——提供统一的入口
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 二十四种设计模式:外观模式(Facade Pattern)
外观模式(Facade Pattern) 介绍为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.示例有一个Message实体类,某对象对它 ...
- 使用C# (.NET Core) 实现适配器模式 (Adapter Pattern) 和外观模式 (Facade Pattern)
本文的概念内容来自深入浅出设计模式一书 现实世界中的适配器(模式) 我带着一个国标插头的笔记本电脑, 来到欧洲, 想插入到欧洲标准的墙壁插座里面, 就需要用中间这个电源适配器. 面向对象的适配器 你有 ...
- 【设计模式】Java设计模式 - 外观模式
Java设计模式 - 外观模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...
- Java设计模式——外观模式
JAVA 设计模式 外观模式 用途 外观模式 (Facade) 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式是一种结构型模式. 结构
- JAVA 设计模式 外观模式
用途 外观模式 (Facade) 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式是一种结构型模式. 结构
- 设计模式-外观模式(Facade)
简介 外观模式(Facade),将外部与内部子系统的通信通过一个统一的门面对象进行. 由两部分组成: 门面角色:供外部调用,内部可能组装了多个子系统,多个方法. 子系统角色:子系统的方法也可以直接供外 ...
- java设计模式——外观模式(门面模式)
一. 定义与类型 定义:门面模式,提供一个统一的接口,用来访问子系统中的一群接口,门面模式定义了一个高层接口,让子系统更容易使用 类型:结构性 二. 使用场景 子系统越来越复杂,增加外观模式提供简单调 ...
随机推荐
- 【maven】pom.xml文件没错,但是项目有小红叉,Problems中可以看到错误:“Dynamic Web Module 3.0 requires Java 1.6 or newer.”
解决方法: 1.将 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>m ...
- Linux下启动和停止Java应用程序的Shell脚本
转自:http://blog.csdn.net/jadyer/article/details/7960802 资料参考来源自兔大侠,并略作修改:http://www.tudaxia.com/archi ...
- Linux /sbin/service脚本一个基本无影响的bug
CentOS提供了一个启动服务的功能:service [service name] (start|stop|restart|...),此功能的执行脚本为/sbin/service. 今天看了下此脚本, ...
- 绕过WAF继续SQL注入
Web Hacker总是生存在与WAF的不断抗争之中的,厂商不断过滤,Hacker不断绕过.WAF bypass是一个永恒的话题,不少基友也总结了很多奇技怪招.那今天我在这里做个小小的扫盲吧.先来说说 ...
- python 文件和路径操作函数小结
1: os.listdir(path) //path为目录 功能相当于在path目录下执行dir命令,返回为list类型 print os.listdir('..') 2: os.path.walk( ...
- TestNG参数化测试Spring应用Dubbo接口
一.配置dubbo的Bean文件: 配置spring-dubbo.xml文件: <dubbo:reference interface="com.datatrees.basisdata. ...
- 云计算之路-阿里云上:启用Windows虚拟内存引发的CPU 100%故障
今天上午11:35~11:40左右,由于负载均衡中的两台云服务器CPU占用突然飚至100%,造成网站5分钟左右不能正常访问,请大家带来了麻烦,请谅解! (上图中红色曲线表示CPU占用) 经过分析,我们 ...
- Mybatis使用Redis二级缓存
在Mybatis中允许开发者自定义自己的缓存,本文将使用Redis作为Mybatis的二级缓存.在Mybatis中定义二级缓存,需要如下配置: 1. MyBatis支持二级缓存的总开关:全局配置变量参 ...
- ffmpeg对rtmp的基本操作[转]
ffplay和ffmpeg调用的库是一样的.我刚才试了一下,是可以播的.ffplay "rtmp://tsl.s1979.cutv.com:1935/cutvChannelLive/AxeF ...
- angular 禁止事件冒泡 和 默认行为
事件冒泡和事件捕捉一直以来都是被讨论的话题,也许大家平时在工作中没有遇到过需要解决事件冒泡的情况举个例子: <body ng-click="fun1()"> <d ...