设计模式总结篇系列:外观模式(Facade)

简介:

张三自从毕业后开始做软件开发,做着做着发现不爽了,钱赚不了太多,头发也白了。于是拿着一点小资本,想着做点小生意。瞅着眼前的餐饮行业还不错,于是打算开一家餐馆。开参观可不是一件容易的事,仅仅行政类的审批流程就不少。至少包括办理卫生许可证,办理税务登记,办理工商登记等。

我们先来看一下行政审批接口:

1 interface Executive{
2     
3     public void approve();
4     
5 }

卫生局类的定义:

复制代码
1 class HealthOffice implements Executive{
2 
3     @Override
4     public void approve() {
5         System.out.println("卫生局通过审批");
6     }
7     
8 }
复制代码

税务局类的定义:

复制代码
1 class RevenueOffice implements Executive{
2 
3     @Override
4     public void approve() {
5         System.out.println("税务局完成登记,定时回去收税");
6     }
7     
8 }
复制代码

工商局类的定义:

复制代码
1 class SaicOffice implements Executive{
2 
3     @Override
4     public void approve() {
5         System.out.println("工商局完成审核,办法营业执照");
6     }
7     
8 }
复制代码

好了,现在客户端需要上场了:

复制代码
 1 public class FacadeTest {
 2 
 3     public static void main(String[] args) {
 4         System.out.println("开始办理行政手续...");
 5 
 6         HealthOffice ho = new HealthOffice();
 7         RevenueOffice ro = new RevenueOffice();
 8         SaicOffice so = new SaicOffice();
 9 
10         ho.approve();
11         ro.approve();
12         so.approve();
13 
14         System.out.println("行政手续终于办完了");
15     }
16 
17 }
复制代码

当然,上面的各个方法不一定都是实现同一个接口的,只是在这个例子中巧合了下。

我们发现,对客户端而言,想要的最终目的和关心的是办理完开饭店的行政审批手续,如果以办理行政手续为一个子系统来看的话,我们发现,上面的设计中客户端直接与子系统内的多个模块进行了交互,对客户端而言,比较麻烦,使得客户端不能简单的使用系统功能,且随着子系统模块的变换客户端可能也需要随着变化。

我们可以通过外观模式来解决上述问题,外观模式的一般描述是:外观模式定义了一个高层的功能,为子系统中的多个模块协同的完成某种功能需求提供简单的对外功能调用方式,使得这一子系统更加容易被外部使用。

利用外观模式对上述类进行重定义。定义一个外观类:

复制代码
 1 class ApproveFacade {
 2 
 3     public ApproveFacade() {
 4 
 5     }
 6 
 7     public void wholeApprove() {
 8         new HealthOffice().approve();
 9         new RevenueOffice().approve();
10         new SaicOffice().approve();
11     }
12 
13 }
复制代码

客户端调用:

复制代码
 1 public class FacadeTest {
 2 
 3     public static void main(String[] args) {
 4         System.out.println("开始办理行政手续...");
 5 
 6         ApproveFacade af = new ApproveFacade();
 7         af.wholeApprove();
 8         
 9         System.out.println("行政手续终于办完了");
10     }
11 
12 }
复制代码

看,通过外观模式后客户端调用够简单了吧。

外观模式的目的不是给予子系统添加新的功能接口,而是为了让外部减少与子系统内多个模块的交互,松散耦合,从而让外部能够更简单地使用子系统。

外观模式的本质是:封装交互,简化调用。

 

---------------------------------------------------------------------------------
笔者水平有限,若有错漏,欢迎指正,如果转载以及CV操作,请务必注明出处,谢谢!
分类: 设计模式

本文转自Windstep博客园博客,原文链接:http://www.cnblogs.com/lwbqqyumidi/p/3754251.html,如需转载请自行联系原作者
目录
相关文章
|
7天前
|
设计模式 缓存 应用服务中间件
「全网最细 + 实战源码案例」设计模式——外观模式
外观模式(Facade Pattern)是一种结构型设计模式,旨在为复杂的子系统提供一个统一且简化的接口。通过封装多个子系统的复杂性,外观模式使外部调用更加简单、易用。例如,在智能家居系统中,外观类可以同时控制空调、灯光和电视的开关,而用户只需发出一个指令即可。
109 69
|
4月前
|
设计模式 Java
Java设计模式-外观模式(11)
Java设计模式-外观模式(11)
|
3月前
|
设计模式 Java
Java设计模式之外观模式
这篇文章详细解释了Java设计模式之外观模式的原理及其应用场景,并通过具体代码示例展示了如何通过外观模式简化子系统的使用。
38 0
|
5月前
|
设计模式 存储 Java
【九】设计模式~~~结构型模式~~~外观模式(Java)
文章详细介绍了外观模式(Facade Pattern),这是一种对象结构型模式,通过引入一个外观类来简化客户端与多个子系统之间的交互,降低系统的耦合度,并提供一个统一的高层接口来使用子系统。通过文件加密模块的实例,展示了外观模式的动机、定义、结构、优点、缺点以及适用场景,并讨论了如何通过引入抽象外观类来提高系统的可扩展性。
【九】设计模式~~~结构型模式~~~外观模式(Java)
|
6月前
|
设计模式 JavaScript 前端开发
js设计模式【详解】—— 外观模式
js设计模式【详解】—— 外观模式
51 2
|
7月前
|
设计模式 Java
Java设计模式:外观模式之优雅门面(九)
Java设计模式:外观模式之优雅门面(九)
|
8月前
|
设计模式
设计模式之-门面 Facade
设计模式之-门面 Facade
68 2
|
7月前
|
设计模式 Java
Java设计模式之外观模式详解
Java设计模式之外观模式详解
|
7月前
|
设计模式
外观模式-大话设计模式
外观模式-大话设计模式
|
7月前
|
设计模式 算法 关系型数据库
设计模式第七讲-外观模式、适配器模式、模板方法模式详解
系统要求所有的数据库帮助类必须实现ISqlHelp接口,面向该接口编程,如SQLServerHelp类。 此时第三方提供了一个新的MySql的帮助类(假设是dll,不能修改),它的编程规范和ISqlHelp不兼容,这个时候就需要引入适配器类,使二者能相互兼容。
186 0