一、定义
隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。
这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。
为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
降低访问复杂系统的内部子系统时的复杂度,简化客户端之间的接口。
二、优缺点
优点: 1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。
缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。
三、自己的理解
这是一个典型的使用迪米特法则和依赖倒置法则的设计模式
实质就是通过一个门面的类,来管理一些实体类,这个门面隐藏了实体类之间的调用关系,调用者只需关心能实现什么功能
四、代码实现
//如果着三个子系统可以抽象成一种能力,可以使用接口抽象整合起来
class System1 {
fun function1() {
println("System1.function1")
}
}
class System2 {
fun function2() {
println("System1.function2")
}
}
class System3 {
fun function3() {
println("System1.function3")
}
}
class Faced {
private val system1 = System1()
private val system2 = System2()
private val system3 = System3()
//通过system1和system3实现一个功能
fun method1() {
system1.function1()
system3.function3()
}
//通过system2和system3实现一个功能
fun method2() {
system2.function2()
system3.function3()
}
}
//main方法算是客户端,并没有直接和实体类System打交道,而是通过门面Faced,这就是迪米特法则的体现
//这个例子并没有体现依赖倒置,如果把System抽象出一个接口,System是面向接口的实现,Faced是面向接口的使用者,这样System和Faced是通过接口产生联系,如果System1换成System2完全没有问题
fun main() {
val faced = Faced()
faced.method1()
faced.method2()
}