设计模式与应用:外观模式

本文通俗的介绍外观模式,且与策略模式进行对比及选用

简介

Facade模式也叫外观模式,是由GoF提出的23种设计模式种的一种

Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作facade

类比理解:电影发行公司,他去跟影院谈影片排片时,他会说自己能拍出哪些类型的电影,希望这几部电影排片率高一些,那么影院真正找电影发行公司要电影发行时,电影发行公司提供电影,但是他的电影都是从那些导演那边拿过来给影院放映的。这个小模型中,电影发行公司其实就是导演或者说众多电影的门面,各大影院需要放映找发行公司就可以,而不是一个一个找导演。

再简单一点理解,他就是一类功能的包工头。

结构图

这里写图片描述

角色和职责

  • Facade:为调用方定义简单的调用接口
  • Clients:调用者。通过Facade接口调用该提供某些功能的内部类群
  • Packages:功能提供者。指提供功能的类群。

实现

这里写图片描述

功能1

package com.mym.designmodel.facade;

/**
 * 职责:Packages:功能提供者。指提供功能的类群。
 * 这里是修电灯工人
 */
public class RepairLight {
    public void repair(){
        System.out.println("修电灯!");
    }
}

功能2

package com.mym.designmodel.facade;

/**
 * 职责:Packages:功能提供者。指提供功能的类群。
 * 这里是修水龙头工人
 */
public class RepairWater {

    public void repair(){
        System.out.println("修水龙头!");
    }

}

外观

package com.mym.designmodel.facade;

/**
 * 职责:Facade:为调用方定义简单的调用接口
 */
public class Facade {

    private RepairWater repairWater = new RepairWater();
    private RepairLight repairLight = new RepairLight();

    public void repairWater(){
        repairWater.repair();
    }

    public void repairLight(){
        repairLight.repair();
    }

    public void repairWaterAndLight(){
        repairWater.repair();
        repairLight.repair();
    }
}

客户端clients

package com.mym.designmodel.facade;

/**
 * 职责: Clients:调用者。通过Facade接口调用该提供某些功能的内部类群
 */
public class MainClass {

    public static void main(String[] args) {
        Facade facade = new Facade();

        //家里水龙头坏了,让它修水龙头
        facade.repairWater();
        System.out.println("-----------------");

        //家里电灯坏了,让它修电灯
        facade.repairLight();
        System.out.println("-----------------");

        //电灯和水龙头都坏了,两个一起修
        facade.repairWaterAndLight();
        System.out.println("-----------------");
    }
}

执行:

修水龙头!
-----------------
修电灯!
-----------------
修水龙头!
修电灯!
-----------------

外观模式与策略模式对比与选用

  • 外观模式让客户端只需要调用方法满足需求。关注的是对外接口外观包装,便捷客户端。他优点在于包装已知功能的对外接口,而缺点就是一旦有新的类似功能就需要改写外观。
  • 策略模式使用时,客户端需要知道有哪些算法策略,才能调用。他的关注点在于策略的快速扩展。

选用时应根据扩展能力与便捷性以及客户端的使用便捷来选取

猜你喜欢

转载自blog.csdn.net/maoyuanming0806/article/details/80335462