实作不依赖多个类别,而是依赖介面,并把这些类别实作在此介面
(相关的 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()
}
>>: 【在 iOS 开发路上的大小事-Day25】透过 Firebase 来管理资料 (Realtime Database 篇) Part1
今天是最後一天了,每天看这本书《听说做完380个实例,就能成为.NET Core大内高手》,真的里面...
前面已经讲完 Processor 和 Connection 两个重要的 Componenet,我们就...
此系列文章会同步发文到个人部落格,有兴趣的读者可以前往观看喔。 今天要跟大家分享在 cypress...
Youtube教学影片连结:https://bit.ly/2ECHcoQ 这次带大家深度了解二元树...
付费连结(Paid Links)在2010年代曾是个有争议的SEO灰色地带,但在多年後今日的SEO...