Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "fmt"
- )
- type ComputerPart interface {
- Accept(ComputerVisitor)
- }
- type ComputerVisitor interface {
- VisitCPU(*CPU)
- VisitDisk(*Disk)
- VisitMemory(*Memory)
- }
- type CPU struct {
- UUID string
- Frequency float64
- }
- func (c *CPU) Accept(v ComputerVisitor) {
- v.VisitCPU(c)
- }
- type Disk struct {
- UUID string
- Size uint64
- }
- func (d *Disk) Accept(v ComputerVisitor) {
- v.VisitDisk(d)
- }
- type Memory struct {
- UUID string
- Size uint64
- }
- func (m *Memory) Accept(v ComputerVisitor) {
- v.VisitMemory(m)
- }
- type Laptop struct {
- Parts []ComputerPart
- }
- func (l *Laptop) Accept(v ComputerVisitor) {
- for _, p := range l.Parts {
- p.Accept(v)
- }
- }
- type SpecsVisitor struct{}
- func (v *SpecsVisitor) VisitCPU(c *CPU) {
- fmt.Printf("cpu uuid=%s freq=%.2f GHz\n", c.UUID, c.Frequency)
- }
- func (v *SpecsVisitor) VisitDisk(d *Disk) {
- fmt.Printf("disk uuid=%s size=%d TB\n", d.UUID, d.Size)
- }
- func (v *SpecsVisitor) VisitMemory(m *Memory) {
- fmt.Printf("ram uuid=%s size=%d GB\n", m.UUID, m.Size)
- }
- func main() {
- l := new(Laptop)
- l.Parts = []ComputerPart{
- &CPU{"dbe0e589-0eba-404e-bf8e-6664e1bc37c4", 3.6},
- &CPU{"fd4db97c-596d-4fe7-9a1a-20cbaf0f4e8e", 3.6},
- &Disk{"1679dc4e-dea9-4da3-bcc9-e6f608f65d56", 3},
- &Disk{"c15fbae8-68e9-455e-8bb0-687c1e9580f5", 3},
- &Memory{"7c4cbdef-005a-44cc-9104-478a2e2b2441", 4},
- &Memory{"15734c16-f73b-4921-805b-7cd6163a9678", 4},
- &Memory{"d3a6fe65-8fe0-47e5-bb7f-34fcd35b0e94", 4},
- &Memory{"f286b96a-d18e-4dbf-b333-371a3ab6ee88", 4},
- }
- visitor := new(SpecsVisitor)
- l.Accept(visitor)
- }
Add Comment
Please, Sign In to add comment