大数据知识体系
首页
数据结构与算法
  • JVM
  • Java
  • Scala
  • Python
设计模式
  • MySQL
  • Redis
  • HDFS
  • HBase
  • ClickHouse
  • ElasticSearch
  • Iceberg
  • Hudi
  • Spark
  • Flink
  • Hive
  • Yarn
  • Zookeeper
  • Maven
  • Git
  • 数据仓库
  • 用户画像
  • 指标体系
数据治理
关于
首页
数据结构与算法
  • JVM
  • Java
  • Scala
  • Python
设计模式
  • MySQL
  • Redis
  • HDFS
  • HBase
  • ClickHouse
  • ElasticSearch
  • Iceberg
  • Hudi
  • Spark
  • Flink
  • Hive
  • Yarn
  • Zookeeper
  • Maven
  • Git
  • 数据仓库
  • 用户画像
  • 指标体系
数据治理
关于
  • 设计模式概述
  • 创建型模式

    • 单例模式
    • 简单工厂模式
    • 工厂方法模式
    • 抽象工厂模式
    • 建造者模式
    • 原型模式
  • 结构型模式

    • 适配器模式
    • 装饰器模式
    • 代理模式
    • 外观模式
      • 一、概述
        • 1.1 解决了什么问题
        • 1.2 解决方案
      • 二、实现方式
    • 桥接模式
    • 组合模式
    • 享元模式
  • 行为型模式

    • 策略模式
    • 模板方法模式
    • 观察者模式
    • 迭代器模式
    • 责任链模式
    • 命令模式
    • 备忘录模式
    • 状态模式
    • 访问者模式
    • 中介者模式
    • 解释器模式
  • 设计模式
  • 结构型模式
Will
2022-03-29
目录

外观模式

# 一、概述

外观(Facade)模式,有些资料叫门面模式,外部与各个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这些子系统更加容易使用。

# 1.1 解决了什么问题

假设张同学要外出旅游,住了一家还不错的酒店。那么整个事情的发展过程可能是这样的:

  1. 张同学预订酒店;
  2. 酒店前台收到订单并预留房间;
  3. 张同学到酒店办理入住;
  4. 张同学入住酒店;
  5. 酒店餐厅为张同学准备早餐;
  6. 张同学就餐;
  7. 张同学办理离店;
  8. 清洁阿姨打扫房间。

在上面这个案例中实际上有张同学、酒店前台、酒店餐厅厨师、清洁阿姨四个角色,每个角色都可以理解为是一个子系统。如果客户端要实现上面整个流程的话,需要创建四个对象,然后挨个调用他们的动作,比较复杂且繁琐,如果对应到生产需求中的各个子系统的话可能更加繁琐。

# 1.2 解决方案

使用外观类对四个对象进行包装,对客户端隐藏四个对象的操作细节,提供统一的外观接口。

# 二、实现方式

定义各个角色类:

/**
 * 顾客类
 */
class Customer {

    public void bookHotel() {
        System.out.println("顾客预订酒店");
    }

    public void register() {
        System.out.println("在酒店登记,办理入住");
    }

    public void enjoy() {
        System.out.println("顾客入住");
    }

    public void eatBreakfast() {
        System.out.println("顾客吃早餐");
    }

    public void leave() {
        System.out.println("顾客离店");
    }
}

/**
 * 酒店前台类
 */
class HotelFrontDesk {
    public void confirmOrder() {
        System.out.println("酒店前台确认订单");
    }
}

/**
 * 厨师
 */
class Chef {
    public void cook() {
        System.out.println("厨师准备早餐");
    }
}

/**
 * 清洁阿姨
 */
class Cleaner {
    public void clean() {
        System.out.println("清洁阿姨打扫房间");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

如果不使用外观模式,整个流程实现方式为:

public class FacadeTest {
    public static void main(String[] args) {
        Customer customer = new Customer();
        HotelFrontDesk hotelFrontDesk = new HotelFrontDesk();
        Chef chef = new Chef();
        Cleaner cleaner = new Cleaner();

        customer.bookHotel();
        hotelFrontDesk.confirmOrder();
        customer.register();
        customer.enjoy();
        chef.cook();
        customer.eatBreakfast();
        customer.leave();
        cleaner.clean();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

如果使用外观模式,实现是这样的:

class Facade {

    private Customer customer;
    private HotelFrontDesk hotelFrontDesk;
    private Chef chef;
    private Cleaner cleaner;

    public Facade() {
        this.customer = new Customer();
        this.hotelFrontDesk = new HotelFrontDesk();
        this.chef = new Chef();
        this.cleaner = new Cleaner();
    }

    /**
     * 预订酒店
     */
    public void bookHotel() {
        customer.bookHotel();
        hotelFrontDesk.confirmOrder();
    }

    /**
     * 入住酒店
     */
    public void customerEnjoy() {
        customer.register();
        customer.enjoy();
        chef.cook();
        customer.eatBreakfast();
    }

    /**
     * 顾客离开
     */
    public void leave() {
        customer.leave();
        cleaner.clean();
    }

}

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

        // 通过外观模式,使得原本暴露给客户端的8个步骤简化成了3个
        // 真实业务中隐藏在子系统中的流程可能更加复杂
        facade.bookHotel();
        facade.customerEnjoy();
        facade.leave();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
顾客预订酒店
酒店前台确认订单
在酒店登记,办理入住
顾客入住
厨师准备早餐
顾客吃早餐
顾客离店
清洁阿姨打扫房间
1
2
3
4
5
6
7
8
上次更新: 2023/11/01, 03:11:44

← 代理模式 桥接模式→

Theme by Vdoing | Copyright © 2022-2023 Will 蜀ICP备2022002285号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式