戏说设计模式(一)外观模式

0. 前言

我发明了一个可以做菜的机器,它有一个菜单,可以给你做菜单里菜肴,如你选择菜单里的西红柿炒蛋,它就会给你来一盘西红柿炒蛋。你以为我在讲真?开玩喜,我只是想用这个例子讲一下外观模式(Facade)

1. 问题

天生我才必有用,外观模式也不例外。在介绍外观模式前,得先说一下出现的问题。

如我开头讲的那个机器,是不是很好用。试想一下如果没有那个机器,如果要做一个西红柿炒蛋,你就要处理西红柿、鸡蛋一顿辛苦爆炒才能得到你要的菜肴。而有了那个机器,你只要轻松一步就搞定。不过如果你要甜味的西红柿炒蛋,就不能使用该机器了,因为该机器的菜单上并没有这个菜(因为比较少人吃),还是要一个一个处理材料然后一顿辛苦爆炒。

说到这里,大家可能有点意识了,没错,我发明那个机器就是相当于采用了外观模式,而那个机器就是外观

2. 外观模式

2.1 问题提出

在一个大一点工程里,会有很多子系统,为了提供复用性,我们会不断细化,然后将子系统又分成若干模块(Module)。这些模块各有各的职责,我们把调用该子系统中模块功能的程序视为客户端。可能很多时候客户端会频繁调用多个模块的功能,而且每次都是这几个。结构图如下:

比如说有个人喜欢西红柿炒蛋,那么他就会频繁地用西红柿和鸡蛋,结构图变成了这样子:

2.2 外观模式解决

这样子的话,就好麻烦了,所以就有了外观模式,就有了我发明的机器。我们可以做一个外观类,在外观类里处理和整合几个常用的模块功能,然后客户端直接调用外观类提供的方法。此时结构图如下:

如果是我的例子的话,结构图就是这个样子

2.3 外观模式的好处

通过上面的例子,大家可以发现,使用了外观模式,就可以减少客户端与子系统内各个模块的交互,降低了耦合度,让客户端更方便地使用子系统,并且隐藏了子系统的内部细节

3. 代码实现

3.1 未使用外观模式前

现在我简单说一下,假设我的一个子系统是菜篮,然后西红柿和鸡蛋是菜篮里面的一部分也就是模块。很明显,西红柿提供西红柿,鸡蛋提供鸡蛋~我就是客户端,如果我要做西红柿炒蛋的话就要从菜篮中得到西红柿和炒蛋。下面就用代码实现。

西红柿类

public class Tomato {
    public void handle(){
        System.out.println("我是西红柿,尽情享用吧~");
    }
}

鸡蛋类

public class Egg {
    public void handle(){
        System.out.println("我是鸡蛋,尽情享用吧~");
    }
}

public class FatMan {

    public static void main(String[] args) {
        Tomato tomato = new Tomato();
        Egg egg = new Egg();
        tomato.handle();
        egg.handle();
    }

}

结果

我是西红柿,尽情享用吧~
我是鸡蛋,尽情享用吧~

看,我要分别调用两个方法,万一我要吃的不是西红柿炒蛋,而是西红柿炒蛋炒鸡肉炒猪肉炒番薯炒土豆。。。呢,万一我女朋友也很喜欢这样子吃呢,我岂不是每次都要搞这么多事。我是个懒人,不想搞这么多事,于是我发明了一个机器。

3.2 使用外观模式

西红柿类和鸡蛋类还是那样,但是我发明了一个机器类,来帮我干活,减轻我负担
机器类

public class Machine {

    public static void handleTAE(){
        Tomato tomato = new Tomato();
        Egg egg = new Egg();
        tomato.handle();
        egg.handle();
    }
}

这时候我就方便多了

public class FatMan {

    public static void main(String[] args) {
        Machine.handleTAE();
    }
}

结果

我是西红柿,尽情享用吧~
我是鸡蛋,尽情享用吧~

4. 结言

看完上面的描述,大家可能对外观模式有点认识了,不过有一点要注意一下。过多或者不太合理的外观也容易让人迷惑。到底是调用外观好呢,还是直接调用模块好?

其实并不是说用了外观模式,就一定要通过外观来访问子系统中的模块功能,其实客户端也可以直接调用子系统中的模块功能,外观只是把比较平常比较多人用的模块功能整合一起,减少客户端与子系统中的耦合,也可以让客户端调用方便。但是有些不太常用的功能,还是不会定义到外观中的,这时候就可以直接调用子系统的模块功能。番茄炒蛋很常见所以定义在外观中,但是番茄炒猪肉就不常见了吧,所以这时候就要分别调用番茄和羊肉了。

简单一句话描述外观模式

封装交互,简化调用


如果上面的内容有错误的地方或者讲的不好的地方,还请大家指点一下,我好及时修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值