十八 结构型-外观模式(Facade)

162 阅读2分钟

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。
小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

image.png 其他设计模式介绍
创建型: 工厂方法 抽象工厂 原型
结构型: 适配器 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式
行为型: 职责链 命令 解释器 迭代器 中介者 备忘录 状态模式 策略模式 模板方法 访问者

定义

为子系统提供一个共同的对外接口 。 客户对象通过一个外观接口读写子系统中各接口的数据资源。

UML图

image.png

外观模式又叫做门面模式,看上去是一个比较宏观的模式,它包含的两个主要角色:

  • Facade(外观)角色:提供一个外观接口,对外,它提供一个易于客户端访问的接口,对内,它可以访问子系统中的所有功能。
  • SubSystem(子系统)角色:子系统在整个系统中可以是一个或多个模块,每个模块都有若干类组成,这些类可能相互之间有着比较复杂的关系。
class ClassA {
    private val classB: ClassB? = null
    fun methodA() {
        methodA2()
    }

    fun methodA2() {
        classB!!.methodB()
    }
}

class ClassB {
    fun methodB() {}
    fun methodB2(classC: ClassC) {
        classC.methodC()
    }
}

class ClassC {
    fun methodC() {}
}

class Facade {
    fun test() {
        val classA = ClassA()
        val classB = ClassB()
        val classC = ClassC()
        classA.methodA()
        classB.methodB()
        classC.methodC()
    }
}

fun main() {
    val facade = Facade()
    facade.test()
}

上述代码中ClassA、ClassB、ClassC是系统中某个模块的三个类,它们之间可以有复杂的依赖关系,但是Facade对象负责将三个类的调用方法包装起来,对外在Client类看来,它好像只有一个方法。对于客户端来讲,简化了接口的调用,原来需要依赖三个类并调用三个类的方法,现在只需要一个。

适用场景

  • 设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。

  • 开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。

  • 维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。

image.png

优点

  • 实现了子系统与客户端之间的松耦合关系。

  • 客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。