Golang设计模式——03外观模式

外观模式

优点

  1. 外观模式(Facade Pattern)也称为过程模式,是结构性模式。外观模式为子系统的一组接口提供了一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式可以理解为转换一群接口,客户只要调用这一个接口而不用调用多个接口才能达到目的,也不需关心这个子系统的内部细节。就是解决多个复杂接口带来的使用困难,起到简化用户操作的作用。
  2. 外观模式对客户端与子系统的耦合关系,让子系统内部的模块更易维护和扩展。
  3. 外观模式对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性。
  4. 当系统需要进行分层设计时,可以考虑外观模式帮我们更好的划分访问的层次。
  5. 在维护一个遗留的大型系统时,可能这个系统已经变得非常难以维护和扩展,此时可以考虑为新系统开发一个Facade类,来提供遗留系统的比较清晰简单的接口,让新系统与Facade类交互,提高复用性。
  6. 在软件开发中,有时候一个客户类需要和多个业务类交互,由于涉及到的类比较多,导致使用时代码较为复杂,此时,特别需要一个能够统筹所有业务类的角色,由它来负责和业务类进行交互,而客户类只需与该类交互。外观模式通过引入一个新的外观类(Facade)来实现该功能,它为多个业务类的调用提供了一个统一的入口,简化了类与类之间的交互。

缺点

  1. 不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活性。
  2. 如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则。

场景

  1. 为一个复杂的模块或子系统提供一个供外界访问的接口

代码

在这里插入图片描述

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观察者模式

posted @ 2021-09-24 16:26  cheems~  阅读(34)  评论(0编辑  收藏  举报