外观模式
优点
外观模式(Facade Pattern)也称为过程模式,是结构性模式。外观模式为子系统的一组接口提供了一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式可以理解为转换一群接口,客户只要调用这一个接口而不用调用多个接口才能达到目的,也不需关心这个子系统的内部细节。就是解决多个复杂接口带来的使用困难,起到简化用户操作的作用。
- 外观模式对客户端与子系统的耦合关系,让子系统内部的模块更易维护和扩展。
- 外观模式对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性。
- 当系统需要进行分层设计时,可以考虑外观模式帮我们更好的划分访问的层次。
- 在维护一个遗留的大型系统时,可能这个系统已经变得非常难以维护和扩展,此时可以考虑为新系统开发一个Facade类,来提供遗留系统的比较清晰简单的接口,让新系统与Facade类交互,提高复用性。
在软件开发中,有时候一个客户类需要和多个业务类交互,由于涉及到的类比较多,导致使用时代码较为复杂,此时,特别需要一个能够统筹所有业务类的角色,由它来负责和业务类进行交互,而客户类只需与该类交互。外观模式通过引入一个新的外观类(Facade)来实现该功能,它为多个业务类的调用提供了一个统一的入口,简化了类与类之间的交互。
缺点
- 不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活性。
- 如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则。
场景
- 为一个复杂的模块或子系统提供一个供外界访问的接口
代码
package Facade import "fmt" type CarModel struct { } func NewCarModel() *CarModel { return &CarModel{} } func (c *CarModel) SetModel() { fmt.Println("CarModel - SetModel") } func (c *CarModel) ModelBroke() { fmt.Println("Model was Broke") } type CarEngine struct { } func NewCarEngine() *CarEngine { return &CarEngine{} } func (c *CarEngine) SetEngine() { fmt.Println("CarEngine - SetEngine") } func (c *CarEngine) EngineBroke() { fmt.Println("Engine was Broke") } type CarBody struct { } func NewCarBody() *CarBody { return &CarBody{} } func (c *CarBody) SetCarBody() { fmt.Println("CarBody - SetBody") } func (c *CarBody) BodyBroke() { fmt.Println("Body was Broke") } type CarFacade struct { model CarModel engine CarEngine body CarBody } func NewCarFacade() *CarFacade { return &CarFacade{ model: CarModel{}, engine: CarEngine{}, body: CarBody{}, } } func (c *CarFacade) CreateCompleteCar() { c.model.SetModel() c.body.SetCarBody() c.engine.SetEngine() } func (c *CarFacade) MethodA() { c.model.SetModel() c.body.BodyBroke() c.engine.SetEngine() c.model.ModelBroke() } func (c *CarFacade) MethodB() { c.model.ModelBroke() c.body.BodyBroke() c.engine.EngineBroke() }
package Facade import "testing" func TestCarFacade_CreateCompleteCar(t *testing.T) { car:=NewCarFacade() car.CreateCompleteCar() car.MethodA() car.MethodB() }
其他设计模式
设计模式Git源代码
00简单工厂模式
01工厂方法模式
02抽象工厂模式
03外观模式
04建造者模式
05桥接模式
06命令模式
07迭代器模式
08模板模式
09访问者模式
10备忘录模式
11责任链模式
12中介模式
13原型模式
14状态模式
15策略模式
16享元模式
17组合模式
18解释器模式
19单例模式
20适配器模式
21代理模式
22装饰器模式
23观察者模式