DAY 23:Facade Pattern,由统一的入口介面来做事

什麽是 Facade Pattern?

实作不依赖多个类别,而是依赖介面,并把这些类别实作在此介面

问题情境

(相关的 code 在Github - go-design-patterns)

当 PS5 启动时,会用到许多 CPU 相关的指令集,以下方范例来说即是StrcutA{}StrcutB{},如果未来要更改StrcutA{}StrcutB{}DoAction()function 呼叫方式,或者StrcutA{}被弃用要改用StructC{},都必须要修改PS5{}.Start()的实作。

package main

import "fmt"

type StructA struct{}

func (s StructA) DoAction() {}

type StructB struct{}

func (s StructB) DoAction() {}

type PS5 struct {
}

func (p PS5) Start() {
	strcutA := StructA{}
	strcutB := StructB{}
	strcutA.DoAction()
	strcutB.DoAction()
	fmt.Println("start ps5...done!")
}

func main() {
	ps5 := PS5{}
	ps5.Start()
}

我们需要一个方式,能让做这些更改时PS5{}.Start()不需要修改。

解决方式

PS5{}.Start()可以只依赖特定介面CPUFacade interface 的Work(),所以可以将StrcutA{}StructB{}的使用方式都封装在Work()中,就算後续StrcutA{}StructB{}有变更呼叫方式或是弃用,都不影响PS5{}.Start()的呼叫。

package main

import "fmt"

type CPUFacade interface {
	Work()
}

type StructA struct{}

func (s StructA) DoAction() {}

type StructB struct{}

func (s StructB) DoAction() {}

type CPU struct{}

func (c CPU) Work() {
	strcutA := StructA{}
	strcutB := StructB{}
	strcutA.DoAction()
	strcutB.DoAction()
}

type PS5 struct {
	cpu CPUFacade
}

func (p PS5) Start() {
	p.cpu.Work()
	fmt.Println("start ps5...done!")
}

func main() {
	ps5 := PS5{cpu: CPU{}}
	ps5.Start()
}

<<:  DAY 21 - 四足战车 (2)

>>:  【在 iOS 开发路上的大小事-Day25】透过 Firebase 来管理资料 (Realtime Database 篇) Part1

第30天:《听说做完380个实例,就能成为.NET Core大内高手》里面真的没怎麽讲.NET Core

今天是最後一天了,每天看这本书《听说做完380个实例,就能成为.NET Core大内高手》,真的里面...

Day8 NiFi - Processor Group

前面已经讲完 Processor 和 Connection 两个重要的 Componenet,我们就...

自动化测试,让你上班拥有一杯咖啡的时间 | Day 14 - 取得 ESLint 支援

此系列文章会同步发文到个人部落格,有兴趣的读者可以前往观看喔。 今天要跟大家分享在 cypress...

【图解演算法教学】二元树 Traversal

Youtube教学影片连结:https://bit.ly/2ECHcoQ 这次带大家深度了解二元树...

3+4 个 Google 判断付费连结 (Paid Links) 的方法

付费连结(Paid Links)在2010年代曾是个有争议的SEO灰色地带,但在多年後今日的SEO...