架构师训练营第 1 期第 3 周作业

用户头像
du tiezheng
关注
发布于: 2020 年 10 月 04 日

组合模式实现窗口显示(打印)



Component为接口。

各个具体组件实现Component的PrintComponent()接口。

其中WinForm,Frame为组合其他Component的非叶节点,内部包含子节点容器;其他类为叶节点。

作为叶节点,直接实现自身打印。

作为非叶节点,除了实现自身打印,还要调用容器内的子节点执行打印。



package main
import "fmt"
func main() {
//创建winform,并添加子元素
wf := WinForm {tag: "WINDOWS窗口", v: make([]Component, 0, 10)}
pic := Picture{tag: "LOGO图片"}
wf.AddSubComponent(pic)
bt1 := Button{tag: "登录"}
wf.AddSubComponent(bt1)
bt2 := Button{tag: "注册"}
wf.AddSubComponent(bt2)
//创建frame,并添加子元素
f := Frame{tag: "FRAME1", v: make([]Component, 0, 10)}
lb1 := Lable{tag: "用户名"}
f.AddSubComponent(lb1)
tb := TextBox{tag: "文本框"}
f.AddSubComponent(tb)
lb2 := Lable{tag: "密码"}
f.AddSubComponent(lb2)
pb := PasswordBox{tag: "密码框"}
f.AddSubComponent(pb)
cb := CheckBox{tag: "复选框"}
f.AddSubComponent(cb)
lb3 := Lable{tag: "记住用户名"}
f.AddSubComponent(lb3)
ll := LinkLable{tag: "忘记密码"}
f.AddSubComponent(ll)
//将frame添加到winform
wf.AddSubComponent(f)
//打印winform
wf.PrintComponent()
}
// Component
type Component interface {
PrintComponent()
}
// WinForm
type WinForm struct {
v []Component
tag string
}
func (wf WinForm) PrintComponent() {
fmt.Printf("print WinForm (%s)\r\n", wf.tag)
for i:= range(wf.v) {
wf.v[i].PrintComponent()
}
}
func (wf *WinForm) AddSubComponent(c Component) {
wf.v = append(wf.v, c)
}
// Picture
type Picture struct {
tag string
}
func (p Picture) PrintComponent() {
fmt.Printf("print Picture (%s)\r\n", p.tag)
}
// Button
type Button struct {
tag string
}
func (b Button) PrintComponent() {
fmt.Printf("print Button (%s)\r\n", b.tag)
}
// Frame
type Frame struct {
v []Component
tag string
}
func (f Frame) PrintComponent() {
fmt.Printf("print Frame (%s)\r\n", f.tag)
for i:= range(f.v) {
f.v[i].PrintComponent()
}
}
func (f *Frame) AddSubComponent(c Component) {
f.v = append(f.v, c)
}
// Lable
type Lable struct {
tag string
}
func (l Lable) PrintComponent() {
fmt.Printf("print Lable (%s)\r\n", l.tag)
}
// TextBox
type TextBox struct {
tag string
}
func (t TextBox) PrintComponent() {
fmt.Printf("print TextBox (%s)\r\n", t.tag)
}
// PasswordBox
type PasswordBox struct {
tag string
}
func (p PasswordBox) PrintComponent() {
fmt.Printf("print PasswordBox (%s)\r\n", p.tag)
}
// CheckBox
type CheckBox struct {
tag string
}
func (cb CheckBox) PrintComponent() {
fmt.Printf("print CheckBox (%s)\r\n", cb.tag)
}
// LinkLable
type LinkLable struct {
tag string
}
func (ll LinkLable) PrintComponent() {
fmt.Printf("print LinkLable (%s)\r\n", ll.tag)
}



用户头像

du tiezheng

关注

还未添加个人签名 2018.08.16 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第 1 期第 3 周作业