# 外观模式
# 初识外观模式
# 定义:
为子系统中一组接口
提供一个一致的界面
,Facade模式定义了一个高层接口
,这个接口使得这一子系统更加容易使用
# 结构和说明:
**界面:**从客户端来看待这个系统,能看到的东西
Facade : 定义子系统的多个模块对外的高层接口,通常需要调用内部多个模块,从而把客户的请求代理给适当的子系统对象
。
**模块:**接收Facade对象的委派,真正实现功能,各个模块之间可能有交互。☂注意:
Facade对象知道各个模块,但是各个模块不应该知道Facade对象
# 体会外观模式
# 生活中的示列:组装电脑
完全自己组装
找专业装机公司组装
# 工具示例:代码生成工具
问题:
如果现在客户端需要使用这个代码生成工具来生成需要的基础代码,该如何来实现呢?
# 不用模式解决方案
存在的问题:
客户端为了使用生成代码的功能,需要与生成代码子系统内部的多个模块交互
# 使用模式解决方案
public interface AModuleApi {
void test();
}
public class AModuleImpl implements AModuleApi{
@Override
public void test() {
System.out.println("模块a");
}
}
public interface BModuleApi {
void test();
}
public class BModuleImpl implements AModuleApi{
@Override
public void test() {
System.out.println("模块b");
}
}
public interface CModuleApi {
void test();
}
public class CModuleImpl implements AModuleApi{
@Override
public void test() {
System.out.println("模块");
}
}
public class Facade {
/**
* 满足客户端需要的方法
*/
public void test(){
// 内部实现的时候,可能会调用各个模块
// 如果遇到这样一种情况,需要按顺序调用这3个方法,那么在客户端使用的时候还需要搞懂先调用什么后调用什么,就很不方便了,所以使用外观模式封装起来
new AModuleImpl().test();
new BModuleImpl().test();
new CModuleImpl().test();
}
}
public class Client {
public static void main(String[] args) {
// 这里使用外观模式,就不再需要客户端与各个模块直接打交道了
new Facade().test();
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 理解外观模式
# 认识外观模式
外观模式的
目的不是给子系统添加新的功能接口
,而是为了让外部减少与子系统内多个模块的交互,松散耦合
,从而让外部能够更简单的使用子系统。不能在外观模式的接口或则类中直接实现客户端的功能。应该是包装组合已有的功能
,来满足客户端的需求使用外观跟不使用外观有何变化? Facade方便了客户端的调用、封装了系统内部的细节功能、实现功能的共享和复用
重点在于Facade的位置
,Facade属于红框中的一部分。所以facade是可以知道具体实现的。 而客户端确是不知道的有外观,但是可以不使用
外观提供了缺省的调用 (对常用的进行一些包装,如果有特殊的需求,就使用第三点,直接调用具体的实现)
外观模式的调用顺序示意图
# 外观模式的实现
把外观类当成一个辅助工具类实现
facade可以实现为interface
Facade实现称为interface的附带好处 能够有选择性的暴露接口方法,尽量减少模块对 外提供的接口方法。
Facade的方法实现 Facade的方法实现中,一般是负责把客户端的请求转发给子系统内部的各个模块进行处理,Facade的方法本身并不进行功能的处理,Facade的方法的实现只是实现一个功能的组合调用
待完结..