设计模式之(十)--外观模式(facade)

    技术2022-05-19  25

    GOF《设计模式》一书对Facade模式是这样描述的:

           为子系统中的一组接口提供一个统一接口。Facade模式定义了一个更高层的接口,使子系统更加容易使用。

           大致意思是说:使用一种比原有方式更简单的办法与系统交互。例如,我们把一个很文件的文件,放在了第二抽屉里,而第二个抽屉的钥匙放在了第一个抽屉里,我们要想取出这个文件,第一步肯定要拿到第一个抽屉的钥匙,然后打开它再拿出第二个抽屉的钥匙,最后打开第二个抽屉取出文件。

    uml类图如下所示: 

           我就上面说的那个情形写一下实现代码,首先我们要实现二个子系统,呵呵,把抽屉比喻成系统,有点夸张了(DrawerOneDrawerTwo):

    public class DrawerOne { public void open() { System.out.println("第一个抽屉被打开了"); getKey(); } public void getKey() { System.out.println("得到第二个抽屉的钥匙"); } } public class DrawerTwo { public void open() { System.out.println("第二个抽屉被打开了"); getFile(); } public void getFile() { System.out.println("得到这个重要文件"); } } //但是如果使用Facade外观模式,可新建一个Facade类: public class DrawerFacade { DrawerOne darwerOne = new DrawerOne(); DrawerTwo darwerTwo = new DrawerTwo(); public void open() { darwerOne.open(); darwerTwo.open(); } } public class Client { public static void main(String[] args) { //不使用外观模式时: DrawerOne darwerOne = new DrawerOne(); DrawerTwo darwerTwo = new DrawerTwo(); darwerOne.open(); darwerTwo.open(); // Facade外观模式: // 为子系统中的一组接口提供一个统一接口。Facade模式定义了一个更高层的接口,使子系统更加容易使用。 System.out.println(""); System.out.println("以下是采用了外观模式后:"); System.out.println(""); DrawerFacade drawer = new DrawerFacade(); drawer.open(); } }

    输出结果:第一个抽屉被打开了得到第二个抽屉的钥匙第二个抽屉被打开了得到这个重要文件

    以下是采用了外观模式后:

    第一个抽屉被打开了得到第二个抽屉的钥匙第二个抽屉被打开了得到这个重要文件

     

    正如上面所说,客户端client,它并不需要关心子系统,而是关心DrawerFacade所留下来的和外部交互的接口,而子系统在DrawerFacade的聚合。

     

    Facade模式主要适用于以下几种情况:

    1)    不需要使用一个复杂系统的所有功能,而且可以创建一个新的类,包含访问系统的所有规则。如果只需要使用系统的部分功能,那么你为新类所创建的API将比原系统的API简单的多。

    2)    希望封装或者隐藏系统原系统。

    3)    希望使用原系统的功能,而且还希望增加一些新的功能。

    4)    编写新类的成本小于所有人学会使用或者未来维护原系统上所需的成本。

     


    最新回复(0)