前言
在简述外观模式前,先看个生活中的例子:
程序员小明到了结婚的年龄,但是由于程序员对于泡妹子这件事来说,咳咳,我相信大部分的程序员都是比较内向,并不是很擅长泡妹子,所以,有个媒人就给小明介绍了3个妹子,3个妹子都长的非常的漂亮,而且每个妹子都有自己擅长的技能,妹子A擅长“吹箫”,妹子B擅长“体操”,妹子C熟悉多种“语言”(你懂的),但是,相亲总得有个开始,小明经过长时间的和她们的“深入了解”,嗯,终于知道什么是“幸福了”,嘿嘿嘿~~
好,我相信大家都没看懂这个例子,我来说明下:
我们知道,妹子们都有自己擅长的技能,但是呢,小明并不是一开始就知道的,小明最初的也就是通过媒人去认识她们,然后经过长时间的了解,才慢慢知道她们的技能,假设,将妹子们当成模块,小明当成客户端,媒人则是他们之间的中介,客户端需要跟模块打交道,通过中介途径,我们就可以知道每个模块的业务功能,这种模式就是外观模式
在外观模式下,模块和客户端之间并不是直接打交道的,而是通过一个统一的中介去间接的打交道,模块隐藏了复杂的业务逻辑,仅仅给客户端提供一个通道,通过这个通道就可以知道每个模块实现的是什么功能,这样,我们并不需要关心模块中的复杂的过程,仅仅只需要通过指定的通道就可以完成我们的功能
用途
外观模式的用途非常广泛,不仅是模块与类之间使用,连数据结构上也可以使用,现在分别来举两个例子
就以上述例子来举:
3个妹子对应的是3个不同的模块,分别是GirlA,GirlB,GirlC
public class GirlA {
//示意方法
public void skillA(){
System.out.println("女孩A所会的技能");
}
}
public class GirlB {
//示意方法
public void skillB(){
System.out.println("女孩B所会的技能");
}
}
public class GirlC {
//示意方法
public void skillC(){
System.out.println("女孩C所会的技能");
}
}
而媒人相当于中介,她负责介绍妹子给小明认识
public class Intermediator {
//示意方法,满足客户端需要的功能
public void test(){
GirlA a = new GirlA();
a.skillA();
GirlB b = new GirlB();
b.skillB();
GirlC c = new GirlC();
c.skillC();
}
}
而小明则是通过中介认识的妹子
public class Client {
public static void main(String[] args) {
Intermediator intermediator = new Intermediator();
intermediator. test();
}
}
我们通过了中介来建立客户端和模块之间的通信,不仅简单,更利于维护,如果我们有n个客户端需要和模块打交道,没有了中介,那维护性和扩展性就会很差,如果某个模块有变动,我们就需要每个客户端都要修改,那得多麻烦
这就是类和模块之间的用途,现在我们来说说数据结构上的用法
假设,后台返回的数据类似这种
{
bean1: {
"id": "1",
"name": "hello"
},
bean2: {
"id": "2",
"name": "hello"
},
bean3: {
"id": "3",
"name": "hello"
}
}
如果不利用外观模式的话,每当我们需要用到里面的bean的时候,我们都需要去实例化,不仅浪费大量的代码,而且还不利于维护,如果要将他们放到List里面的时候,那就很头疼了,利用外观模式就简单点多了,我们只需要用一个BaseBean将他们存放起来,等用的时候之间就可以实力化拿出来了,看看怎么写:
Bean1
public class Bean1{
public int id;
public String name;
}
Bean2
public class Bean2{
public int id;
public String name;
}
Bean1
public class Bean3{
public int id;
public String name;
}
BaseBean
public class BaseBean{
public Bean1 bean1;
public Bean2 bean2;
public Bean3 bean3;
}
而我们用的时候只需要实力化BaseBean,就可以拿出数据了,也只需要将BaseBean添加到List就可以
优点
讲述了这么多,相信它的优点显而易见了,总的来说有这么几点:
- 降低偶尔性
门面模式降低了客户端与模块的耦合度,让模块能更容易扩展和维护 - 简单易维护
我们不需要知道模块内部上实现逻辑,仅仅需要知道怎么用就可以了 - 整洁
通过上述的例子,它的整洁程度显然易见,编写过程很简单,不需要考虑太多 - 统一性
我们仅仅需要一个类就可以完成统一模块的调用,代码量很少
好了,到这外观模式就结束了~~