FacadePattern(23种设计模式之一)
设计模式六大原则(1):单一职责原则
设计模式六大原则(2):里氏替换原则
设计模式六大原则(3):依赖倒置原则
设计模式六大原则(4):接口隔离原则
设计模式六大原则(5):迪米特法则
设计模式六大原则(6):开闭原则
若有理解不到位,欢迎留言讨论!
外观设计模式典型实例:显示生活中有一个种电视万能遥控器,只要和电视配对好了以后,就可以正常使用,不同型号的电视,只要一旦适配,所有的操作模式一模一样。这就是一种外观适配模式。表面上都是同一个遥控器,实际上不同型号的电视,不同的操作,发出的型号可能各不相同。但是对于用户来说,没有任何差别。定义,要求一个子系统的外部和其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易使用。
FacadePattern,UML抽象图百度找,代码实现如下
使用外观设计模式设计一个子系统拥有三个模块,每个模块都有三个方法,其中一个为客户端调用方法,其它两个为各个子模块间互相调用方法。此时客户端需要组合三个模块中的方法才能完成功能。
子系统抽象类
package FacadePattern;
public interface AModuleApi {
//此方法用于外部调用
public void a1();
//以下两个方法主要用于子系统内部间系统调用
public void a2();
public void a3();
}
package FacadePattern;
public interface BModuleApi {
//此方法用于外部调用
public void b1();
//以下两个方法主要用于子系统内部间系统调用
public void b2();
public void b3();
}
package FacadePattern;
public interface CModuleApi {
//此方法用于外部调用
public void c1();
//以下两个方法主要用于子系统内部间系统调用
public void c2();
public void c3();
}
子系统实现类
package FacadePattern.ModuleImpl;
import FacadePattern.AModuleApi;
public class AModuleImpl implements AModuleApi {
public void a1() {
System.out.println("调用了A模块");
}
public void a2() {
// 主要用于子模块之间的相互调用
}
public void a3() {
// 主要用于子模块之间的相互调用
}
}
package FacadePattern.ModuleImpl;
import FacadePattern.BModuleApi;
public class BModuleImpl implements BModuleApi {
public void b1() {
System.out.println("调用了B模块");
}
public void b2() {
// 主要用于子模块之间的相互调用
}
public void b3() {
// 主要用于子模块之间的相互调用
}
}
package FacadePattern.ModuleImpl;
import FacadePattern.CModuleApi;
public class CModuleImpl implements CModuleApi {
public void c1() {
System.out.println("调用了C模块");
}
public void c2() {
// 主要用于子模块之间的相互调用
}
public void c3() {
// 主要用于子模块之间的相互调用
}
}
非外观设计模式客户端
package FacadePattern.Test;
import FacadePattern.AModuleApi;
import FacadePattern.BModuleApi;
import FacadePattern.CModuleApi;
import FacadePattern.ModuleImpl.AModuleImpl;
import FacadePattern.ModuleImpl.BModuleImpl;
import FacadePattern.ModuleImpl.CModuleImpl;
public class NoFacadeClient {
public static void main(String[] args) {
AModuleApi aModule = new AModuleImpl();
aModule.a1(); //启动子系统一
BModuleApi bModule = new BModuleImpl();
bModule.b1(); //启动子系统二
CModuleApi cModule = new CModuleImpl();
cModule.c1(); //启动子系统三
}
}
上面的代码我们会经常写,自习详细,会存在如下问题:
- 代码耦合度太高,客户端与子系统中各模块都有关联。一旦子系统有什么更改,会涉及到客户端的修改。
- 客户端想要知道每个模块中各个方法的含义才能进行调用。
现在采用了外观设计模式,添加一个外观类,由外观重组需要调用的方法
外观抽象类
package FacadePattern;
public interface FacadeApi {
public void a1();
public void b1();
public void c1();
public void test();
}
外观实现类
package FacadePattern.ModuleImpl;
import FacadePattern.FacadeApi;
public class FacadeImpl implements FacadeApi {
public void a1() {
new AModuleImpl().a1();
}
public void b1() {
new BModuleImpl().b1();
}
public void c1() {
new CModuleImpl().c1();
}
public void test() {
a1();
b1();
c1();
}
}
采用了外观设计模式的客户端
package FacadePattern.Test;
import FacadePattern.FacadeApi;
import FacadePattern.ModuleImpl.FacadeImpl;
public class FacadeClient {
public static void main(String[] args) {
FacadeApi facade = new FacadeImpl();
facade.test();
}
}
在test方法中,调用了三个模块中的方法。外观类是在服务端的,不是这客户端。客户端不需要知道具体的内部实现是什么样的。
客户端只需要调用外观模式中的代码即可,不需要关注具体实现细节。
别嫌弃我没写注释,这个代码很简单,注释省略,嘿嘿。
FacadePattern(23种设计模式之一)的更多相关文章
- Java开发中的23种设计模式详解
[放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...
- Java开发中的23种设计模式详解(转)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- Java开发中的23种设计模式(转)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- c#中的23种设计模式
C# 23种设计模式汇总 创建型模式 工厂方法(Factory Method) 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节.工厂方法模式的核 ...
- Java 23种设计模式
转自: http://zz563143188.iteye.com/blog/1847029 ; i<count; i++){ list.add(new MailSender()); } } pu ...
- 从追MM谈Java的23种设计模式(转)
从追MM谈Java的23种设计模式 这个是从某个文章转载过来的.但是忘了原文链接.如果知道的,我追加一下. 1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西 ...
- java 23种设计模式及具体例子 收藏有时间慢慢看
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代 码可靠性. 毫无疑问,设计模式 ...
- JAVA:23种设计模式详解(转)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- 从追MM谈Java的23种设计模式
从追MM谈Java的23种设计模式 1.FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯 德基,只管向服务员说“来四个鸡 ...
- 23种设计模式全解析 (java版本)
转自:http://blog.csdn.net/longyulu/article/details/9159589 其中PHP常用的五种设计模式分别为:工厂模式,单例模式,观察者模式,策略模式,命令模式 ...
随机推荐
- jstl错误排除:According to TLD or attribute directive in tag file, attribute value does not accept any expressions
问题描述: 在 JSP 页面中使用 JSTL 标签库,访问 JSP 页面时抛出了如下异常信息: org.apache.jasper.JasperException: /index.jsp (line: ...
- VC++ windows开机自启动设置
设置开机启动 很多软件要求软件能够在开机时自启动,下面讲讲如何设置开机自启动. Windows设置程序的开机启动的方法有很多,这里只讲其中的一种,该方法同时适用于32位和64位的操作系统,只需将需要开 ...
- 基于注解的 Spring MVC 简单入门
web.xml 配置: <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class> ...
- selenium - 控制浏览器窗口的大小和浏览器最大化
1.控制浏览器大小 有些前端的页面需要查看在不同像素下的兼容情况,比如把像素设置为 480*800,然后截图看看页面显示有没有问题 WebDriver 提供了 set_windows_size() 方 ...
- Python--urllib3库
Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库,许多Python的原生系统已经开始使用urllib3.Urllib3提供了很多python标准库里所没有的重要特性: 1 ...
- WM_COMMAND 和 WM_NOTIFY 的区别
当我们按下一个菜单选项,或者一个控件需要通知父窗口一个事件发生(如鼠标单击.双击等),或者快捷键被按下时,Windows将会发送一个 WM_COMMAND 消息给父窗口.那么 WM_COMMAND 消 ...
- CAN总线优点
废除传统的站地址编码,代之以对通信数据块进行编码,可以多主方式工作: 采用非破坏性仲裁技术,当两个节点同时向网络上传送数据时,优先级低的节点主动停止数据发送,而优先级高的节点可不受影响继续传输数据,有 ...
- 1141 PAT Ranking of Institutions
题意:给出考生id(分为乙级.甲级和顶级),取得的分数和所属学校.计算各个学校的所有考生的带权总成绩,以及各个学校的考生人数.最后对学校进行排名. 思路:本题的研究对象是学校,而不是考生!因此,建立学 ...
- Composer安装使用
Composer 是 PHP5.3以上 的一个依赖管理工具.它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们. 1.下载 2.安装成功 3.配置地址 4.安装代码库 镜像 配置json
- 动态代理AOP实现方法过滤
上一节实现了动态代理,接下来 有时候,我不需要在每一个方法都要记录日志,做权限验证 等等. 所有就有了这样的需求.AOP实现特定方法过滤,有选择性的来对方法实现AOP 拦截.就是本节标题所示. 举个例 ...