浅墨散人 浅墨散人
  • 基础
  • 设计模式
  • JVM
  • Maven
  • SpringBoot
  • 基础
  • Flask
  • Diango
  • Pandas
  • SqlAlchemy
  • Sqoop
  • Flume
  • Flink
  • Hadoop
  • Hbase
  • Hive
  • Kafka
  • Kylin
  • Zookeeper
  • Tez
  • MySQL
  • Doris
  • Chrome
  • Eclipse
  • IDEA
  • iTerm2
  • Markdown
  • SublimeText
  • VirtualBox
  • WebStrom
  • Linux
  • Mac
  • Hexo
  • Git
  • Vue
  • VuePress
  • 区块链
  • 金融
数据仓库
数据治理
读书笔记
关于我
GitHub (opens new window)
  • 基础
  • 设计模式
  • JVM
  • Maven
  • SpringBoot
  • 基础
  • Flask
  • Diango
  • Pandas
  • SqlAlchemy
  • Sqoop
  • Flume
  • Flink
  • Hadoop
  • Hbase
  • Hive
  • Kafka
  • Kylin
  • Zookeeper
  • Tez
  • MySQL
  • Doris
  • Chrome
  • Eclipse
  • IDEA
  • iTerm2
  • Markdown
  • SublimeText
  • VirtualBox
  • WebStrom
  • Linux
  • Mac
  • Hexo
  • Git
  • Vue
  • VuePress
  • 区块链
  • 金融
数据仓库
数据治理
读书笔记
关于我
GitHub (opens new window)
  • 设计模式

    • Java设计模式
    • 享元模式(FlyWeight)
    • 代理模式(Proxy)
    • 单例模式(Singleton)
    • 原型模式(Prototype)
    • 外观模式(Facade)
      • 一、外观模式介绍
      • 二、外观模式代码实现
      • 三、开发中外观模式应用场景
    • 工厂模式(Factory)
    • 建造者模式(Builder和Director)
    • 桥接模式(Bridge)
    • 组合模式(Composite)
    • 装饰器模式(Decorator)
    • 适配器模式(Adpater)
  • Java
  • DesignPattern
2016-03-29
目录

外观模式(Facade)

# 一、外观模式介绍

面向对象的一个比较重要的法则:迪米特法则(最少知识原则):一个软件实体应当尽可能少的与其他实体发生相互作用。 **外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口。这个接口使得这一子系统更加容易使用。**说白了,就可以理解为封装 外观模式的核心:为子系统提供统一的入口,封装子系统的复杂性,便于客户端调用 例1:股民炒股 未使用外观模式情况 要让股民尽可能少的与股票直接打交道,给其提供一个蒙面,让股民跟蒙面打交道。这样就符合了迪米特法则,让股民尽可能少的与股票打交道了。 增加了外观模式后的类图:

例2:客户喝茶,客户要尽可能少的与子系统(开水,茶具,茶叶...)打交道,提供一个服务员,统一了喝茶的入口。 例3:公司注册流程 未使用外观模式的注册流程 使用了外观模式后呢?也就是找个代理公司来帮我们做这些事 外观模式类结构图:

# 二、外观模式代码实现

外观模式代码实现 未使用外观模式情况下,代码如下 子系统代码:

/**
 * 所有子系统
 */
public class SubSystemClass {
    public void methodOne(){
        System.out.println("子系统方法1");
    }
}
class SubSystemClass2{
    public void methodTwo(){
        System.out.println("子系统方法2");
    }
}
class SubSystemClass3{
    public void methodThree(){
        System.out.println("子系统方法3");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

测试代码:

public static void main(String[] args) {
    //未使用外观模式情况
    SubSystemClass s1 = new SubSystemClass();
    SubSystemClass2 s2 = new SubSystemClass2();
    SubSystemClass3 s3 = new SubSystemClass3();
    s1.methodOne();
    s2.methodTwo();
    s3.methodThree();
}
1
2
3
4
5
6
7
8
9

增加外观模式后:新增一个Facade类

/**
 * 外观模式:封装子系统,对外提供一个门面方法
 */
public class Facade {
    //所有子系统的引用
    private SubSystemClass s1 = null;
    private SubSystemClass2 s2 = null;
    private SubSystemClass3 s3 = null;
    //构造子系统的引用
    public Facade() {
        this.s1 = new SubSystemClass();
        this.s2 = new SubSystemClass2();
        this.s3 = new SubSystemClass3();
    }
    /**
     * 具体的外观方法
     */
    public void facade(){
        s1.methodOne();
        s2.methodTwo();
        s3.methodThree();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

再次测试:

public static void main(String[] args) {
    //使用了外观模式后
    System.out.println("-----------------------");
    Facade facade = new Facade();
    facade.facade();
}
1
2
3
4
5
6

两次的输出结果为: 子系统方法1 子系统方法2 子系统方法3 -----分隔符------- 子系统方法1 子系统方法2 子系统方法3

# 三、开发中外观模式应用场景

其实外观模式就是我们常见的封装,在我们实际开发中,遇到的各种对子系统各模块封装的逻辑,都可以理解为外观模式 JDBC封装后的,commons提供的DBUtils类 Hibernate提供的工具类,Spring JDBC工具类等

#java#设计模式
最后更新时间: 2022/7/23 10:17:11
原型模式(Prototype)
工厂模式(Factory)

← 原型模式(Prototype) 工厂模式(Factory)→

最近更新
01
分区分桶
08-21
02
数据模型(重要)
08-21
03
安装和编译
08-21
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式