外观模式Facade模式【kotlin版代码参考】
class Fan {
fun on() {
println("开风扇")
}
fun off() {
println("关风扇")
}
}
class Light {
fun on() {
println("开灯")
}
fun off() {
println("关灯")
}
}
class Tv {
fun on() {
println("开电视")
}
fun off() {
println("关电视")
}
}
class SmartSpeaker {
private var light: Light = Light()
private var tv: Tv = Tv()
private var fan: Fan = Fan()
fun say(order: String) {
if (order.contains("起床")) {
getUp()
} else if (order.contains("睡觉")) {
sleep()
} else {
println("我还听不懂你说的啥!")
}
}
private fun sleep() {
println("起床")
light.on()
tv.on()
fan.off()
}
private fun getUp() {
println("睡觉")
light.off()
tv.off()
fan.on()
}
}
val smartSpeaker = SmartSpeaker()
smartSpeaker.say("我要睡觉了!")
适用场景:
对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。
当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问。
当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性。
优点:
简化了调用过程,无需深入了解子系统,以防给子系统带来风险。
减少系统依赖、松散耦合。
更好地划分访问层次,提高了安全性。
遵循迪米特法则,即最少知道原则。
缺点:
当增加子系统和扩展子系统行为时,可能容易带来未知风险。
不符合开闭原则。
某些情况下可能违背单一职责原则。