Java设计模式之——外观模式

前言

在简述外观模式前,先看个生活中的例子:

程序员小明到了结婚的年龄,但是由于程序员对于泡妹子这件事来说,咳咳,我相信大部分的程序员都是比较内向,并不是很擅长泡妹子,所以,有个媒人就给小明介绍了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就可以


优点

讲述了这么多,相信它的优点显而易见了,总的来说有这么几点:

  • 降低偶尔性
    门面模式降低了客户端与模块的耦合度,让模块能更容易扩展和维护
  • 简单易维护
    我们不需要知道模块内部上实现逻辑,仅仅需要知道怎么用就可以了
  • 整洁
    通过上述的例子,它的整洁程度显然易见,编写过程很简单,不需要考虑太多
  • 统一性
    我们仅仅需要一个类就可以完成统一模块的调用,代码量很少

好了,到这外观模式就结束了~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容