外观模式(Facade Design Pattern)
外观模式又叫门面模式,它通过定义一个高层接口,来隐藏子系统的复杂性,为外界提供一个一致的接口。
现在的软件系统上点规模都会比较复杂,尽管我们已经尽力将一个系统分为几个较小的子系统了,仍然会存在各种问题,比如子系统中有许多类型,调用端就需要和这些对象打交道才能完成各自的功能。
生活中的医院就是这样,病人去医院想治好自己的病需要和医院里各个部门打交道,首先需要去挂号,再去门诊、化验,然后收费、取药,过程非常复杂。
解决这种问题的方式就是引入外观模式,可以在医院设立一个接待员,病人只需要和接待员接触,然后由接待员负责和其它部门沟通。在软件系统中同样也会有类似的问题,这时就可以引入外观模式解决这种问题。
代码示例
我们假设一程序员下班回到家想要洗澡,那么它首先需要打开灯、热水器、空调,边洗澡还想边看个电视,一步步完成这些操作步骤是有点多,我们这个是个聪明的程序员,他做了智能家居改装,这样就只需要一键就可以完成所有操作。
package facade
import "fmt"
type Light struct{}
func (l Light) Open() {
fmt.Println("打开灯")
}
type TV struct{}
func (tv TV) Open() {
fmt.Println("打开电视机")
}
type AirConditioning struct{}
func (a AirConditioning) Open() {
fmt.Println("打开空调")
}
type WaterHeater struct{}
func (w WaterHeater) Open() {
fmt.Println("打开热水器")
}
type Facade struct{}
func (f Facade) Open() {
Light{}.Open()
TV{}.Open()
AirConditioning{}.Open()
WaterHeater{}.Open()
}
调用:
var fa Facade
fa.Open()
// Output:
// 打开灯
// 打开电视机
// 打开空调
// 打开热水器