3.2 解决方案
3.2.1 外观模式来解决
用来解决上述问题的一个合理的解决方案就是外观模式。那么什么是外观模式呢?
(1)外观模式定义
这里先对两个词进行一下说明,一个是界面,一个是接口。
- 界面
一提到界面,估计很多朋友的第一反应就是图形界面(GUI)。其实在这里提到的界面,主要指的是从一个组件外部来看这个组件,能够看到什么,这就是这个组件的界面,也就是所说的外观。
比如:你从一个类外部来看这个类,那么这个类的public方法就是这个类的外观,因为你从类外部来看这个类,就能看到这些。
再比如:你从一个模块外部来看这个模块,那么这个模块对外的接口就是这个模块的外观,因为你就只能看到这些接口,其它的模块内部实现的东西是被接口封装隔离了的。
- 接口
一提到接口,做Java的朋友的第一反应就是interface。其实在这里提到的接口,主要是指的外部和内部交互的这么一个通道,通常是指的一些方法,可以是类的方法,也可以是interface的方法。也就是说,这里说的接口,并不等价于interface,也有可能是一个类。
(2)应用外观模式来解决的思路
仔细分析上面的问题,客户端想要操作更简单点,那就根据客户端的需要来给客户端定义一个简单的接口,然后让客户端调用这个接口,剩下的事情就不用客户端管,这样客户端就变得简单了。
当然,这里所说的接口就是客户端和被访问的系统之间的一个通道,并不一定是指Java的interface。事实上,这里所说的接口,在外观模式里面,通常指的是类,这个类被称为“外观”。
外观模式就是通过引入这么一个外观类,在这个类里面定义客户端想要的简单的方法,然后在这些方法的实现里面,由外观类再去分别调用内部的多个模块来实现功能,从而让客户端变得简单,这样一来,客户端就只需要和外观类交互就可以了。
3.2.2 模式结构和说明
外观模式的结构如图3.4所示:
图3.4 外观模式结构示意图
Facade:
定义子系统的多个模块对外的高层接口,通常需要调用内部多个模块,从而把客户的请求代理给适当的子系统对象。
模块:
接受Facade对象的委派,真正实现功能,各个模块之间可能有交互。
但是请注意,Facade对象知道各个模块,但是各个模块不应该知道Facade对象。
3.2.3 外观模式示例代码
由于外观模式的结构图过于抽象,因此把它稍稍具体点,假设子系统内有三个模块,分别是AModule、BModule和CModule,它们分别有一个示意的方法,那么此时示例的整体结构如图3.5所示:
图3.5 外观模式示例的整体结构示意图
还是来看看代码示例,会比较清楚。
(1)首先定义A模块的接口,A模块对外提供功能方法,从抽象的高度去看,可以是任意的功能方法,示例代码如下:
/** * A模块的接口 */ public interface AModuleApi { /** * 示意方法,A模块对外的一个功能方法 */ public void testA(); } |
(2)实现A模块的接口, 简单示范一下,示例代码如下:
public class AModuleImpl implements AModuleApi{ public void testA() { System.out.println("现在在A模块里面操作testA方法"); } } |
(3)同理定义和实现B模块、C模块,先看B模块的接口定义,示例代码如下:
public interface BModuleApi { public void testB(); } |
B模块的实现示意,示例代码如下:
public class BModuleImpl implements BModuleApi{ public void testB() { System.out.println("现在在B模块里面操作testB方法"); } } |
C模块的接口定义,示例代码如下:
public interface CModuleApi { public void testC(); } |
C模块的实现示意,示例代码如下:
public class CModuleImpl implements CModuleApi{ public void testC() { System.out.println("现在在C模块里面操作testC方法"); } } |
(4)定义外观对象,示例代码如下:
/** * 外观对象 */ public class Facade { /** * 示意方法,满足客户需要的功能 */ public void test(){ //在内部实现的时候,可能会调用到内部的多个模块 AModuleApi a = new AModuleImpl(); a.testA(); BModuleApi b = new BModuleImpl(); b.testB(); CModuleApi c = new CModuleImpl(); c.testC(); } } |
(5)客户端如何使用呢,直接使用外观对象就可以了,示例代码如下:
public class Client { public static void main(String[] args) { //使用Facade new Facade().test(); } } |
运行结果如下:
现在在A模块里面操作testA方法 现在在B模块里面操作testB方法 现在在C模块里面操作testC方法 |
3.2.4 使用外观模式重写示例
要使用外观模式重写前面的示例,其实非常简单,只要添加一个Facade的对象,然后在里面实现客户端需要的功能就可以了。
(1)新添加一个Facade对象,示例代码如下:
/** * 代码生成子系统的外观对象 */ public class Facade { /** * 客户端需要的,一个简单的调用代码生成的功能 */ public void generate(){ new Presentation().generate(); new Business().generate(); new DAO().generate(); } } |
(2)其它的定义和实现都没有变化,这里就不去赘述了
(3)看看此时的客户端怎么实现,不再需要客户端去调用子系统内部的多个模块,直接使用外观对象就可以了,示例代码如下:
public class Client { public static void main(String[] args) { //使用Facade new Facade().generate(); } } |
去运行看看,是否能正确地实现功能。
如同上面讲述的例子,Facade类其实相当于A、B、C模块的外观界面,Facade类也被称为A、B、C模块对外的接口,有了这个Facade类,那么客户端就不需要知道系统内部的实现细节,甚至客户端都不需要知道A、B、C模块的存在,客户端只需要跟Facade类交互就好了,从而更好的实现了客户端和子系统中A、B、C模块的解耦,让客户端更容易的使用系统。
ps:转载私塾在线
相关推荐
外观模式(Facade Pattern)是设计模式中的一种结构型模式,它的主要目的是为了解耦系统,提供一个统一的入口,使得客户端可以更容易地使用复杂的子系统。在Java中,外观模式通常用于简化对复杂系统的访问,它创建了...
**外观模式(Facade Pattern)**是一种结构型设计模式,它为复杂的系统或子系统提供一个简单的接口,使得客户端可以不关心内部的复杂性,只通过这个接口与子系统进行交互。这种模式降低了系统的复杂度,提高了代码的...
**外观模式(Facade)**是一种结构型设计模式,它的主要目的是为了解耦复杂的系统,提供一个简单的接口,使得客户端可以更方便地使用系统的子系统。在C++编程中,外观模式的应用尤为常见,因为它能够有效地降低系统...
设计模式外观模式PPT学习教案 在软件设计中,外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口来访问子系统中的多个接口,从而简化了子系统的使用和维护。本节课程将详细介绍外观模式的...
用外观模式实现下面这个抵押系统。 考虑这样一个抵押系统,当有一个客户来时,有如下几件事情需要确认: 1到银行子系统查询他是否有足够多的存款, 2到信用子系统查询他是否有良好的信用, 3到贷款子系统查询他有无...
2. 当需要独立于系统的某些部分进行开发时,可以使用外观模式作为两者之间的桥梁。 3. 在层次化系统中,可以使用外观模式在不同层次之间提供接口。 在实际编程中,我们经常可以看到外观模式的应用,例如在框架设计...
适配器模式和外观模式是两种非常重要的设计模式,它们在实际项目中有着广泛的应用。本资源提供了一个关于这两种模式的实战示例,帮助我们更好地理解和应用它们。 适配器模式(Adapter Pattern)的主要目的是将两个...
下面我们将详细探讨Android外观模式的概念、结构以及如何通过提供的"Android外观模式demo"进行实践。 外观模式的核心思想是提供一个统一的入口,隐藏系统的复杂性。在Android环境中,这通常意味着创建一个类,该类...
2. **过度使用可能导致设计混乱**:如果过度使用外观模式,则可能会导致系统的架构变得模糊不清。 综上所述,外观模式通过提供一个统一的接口来简化客户端的使用,降低了子系统间的耦合度,但在实际应用中也需要...
**外观模式(Facade Pattern)**是软件设计模式中的一种结构型模式,它的主要目的是为了解耦复杂的系统,提供一个统一的接口,使得客户端可以更容易地使用这个系统。在Java编程中,外观模式的应用广泛,尤其是在处理...
**外观模式(Facade Pattern)**是软件工程中一种常用的设计模式,它为复杂的子系统提供了一个简单的接口,使得客户端代码可以更容易地与这些子系统交互。在C#中,外观模式同样被广泛应用,以降低系统的复杂性,提高...
**外观模式(Facade Pattern)**是软件设计模式中的一种结构型模式,它的主要目的是为了解耦复杂的系统,提供一个统一的接口,使得客户端可以更容易地使用这个系统。在这个模式中,外观类作为客户端与子系统之间的...
大话设计模式之外观模式 经典代码 C#类
装饰模式和外观模式是软件设计模式中的两种重要结构模式,它们在实际开发中有着广泛的应用。下面我们将分别探讨这两种模式的原理、应用场景以及实例代码。 首先,装饰模式(Decorator Pattern)是一种行为设计模式...
外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用于与一个复杂的子系统进行交互。这个接口简化了子系统的使用,使得客户端无需了解子系统内部的复杂性。在本示例中,电脑整机可以看作是...
**外观模式(Facade Pattern)**是一种结构型设计模式,它主要解决的是复杂系统或子系统对外暴露一个简单统一的接口,使得客户端无需关心内部复杂的交互细节。这种模式在实际开发中广泛应用,尤其在大型项目中,它能...
2. 在多个子系统之间进行协调时,可以通过外观模式来减少他们之间的依赖。 3. 需要降低系统间的耦合度,提高系统的可扩展性。 综上所述,外观模式是软件设计中一种重要的模式,它帮助我们在处理复杂系统时保持代码...
在压缩包中的"facade"文件可能包含的就是上述的源代码示例,包括`Facade`类、`SubSystem1`和`SubSystem2`的定义,以及一个简单的客户端程序来演示如何使用外观模式。通过查看这个文件,你可以更深入地理解外观模式在...
### 深入浅出设计模式之适配器模式与外观模式 在软件工程领域,设计模式被广泛地应用于解决常见的编程问题。其中,《Head First 设计模式》是一本非常受欢迎的经典著作,它通过生动有趣的例子帮助读者理解并掌握...
外观模式是面向对象设计模式的一种,它的主要目标是提供一个统一的接口,用于与复杂的子系统进行交互,简化客户端代码,使得客户类无需了解子系统内部的复杂性。 首先,让我们深入理解外观模式的核心概念。外观模式...