外观模式是一种结构型设计模式,能为程序库、框架或其他复杂类提供一个简单的接口。
解决什么问题?
假设你必须在代码中使用某个复杂的库或框架中的众多对象。 正常情况下, 你需要负责所有对象的初始化工作、 管理其依赖关系并按正确的顺序执行方法等。最终, 程序中类的业务逻辑将与第三方类的实现细节紧密耦合, 使得理解和维护代码的工作很难进行。此时可考虑使用外观模式,将复杂的调用关系进行整理,对外提供简单的接口。
实现步骤:
- 厘清子系统的类调用关系
- 创建外观类,对子系统的类进行组合调用,实现全新的功能,简化客户端编码
优势:
- 你可以让自己的代码独立于复杂子系统。
劣势:
- 外观可能成为与程序中所有类都耦合的
上帝对象。
实现实例代码:
package main
type videoFile struct{}
func (v *videoFile) doSomething(filename string) {}
type audioMixer struct{}
func (a *audioMixer) doSomething(vf *videoFile) {}
type codecCompression struct{}
func (c *codecCompression) doSomething(vf *videoFile) {}
type videoConverter struct{}
func (v *videoConverter) convert(filename string) {
vf := videoFile{}
am := audioMixer{}
cc := codecCompression{}
vf.doSomething(filename)
am.doSomething(&vf)
cc.doSomething(&vf)
}
func main() {
vc := videoConverter{}
vc.convert("hello.mp4")
}