本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。
小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
其他设计模式介绍
创建型:
工厂方法
抽象工厂
原型
结构型:
适配器
桥接模式
组合模式
装饰模式
外观模式
享元模式
代理模式
行为型:
职责链
命令
解释器
迭代器
中介者
备忘录
状态模式
策略模式
模板方法
访问者
定义
为子系统提供一个共同的对外接口 。 客户对象通过一个外观接口读写子系统中各接口的数据资源。
UML图
外观模式又叫做门面模式,看上去是一个比较宏观的模式,它包含的两个主要角色:
- 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类看来,它好像只有一个方法。对于客户端来讲,简化了接口的调用,原来需要依赖三个类并调用三个类的方法,现在只需要一个。
适用场景
-
设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。
-
开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。
-
维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。
优点
-
实现了子系统与客户端之间的松耦合关系。
-
客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。