分享
原 大话设计模式(golang) 七、模版方法模式
平凡之路 · · 7629 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
模式特点:通过吧不变的行为搬到父类,去除子类中的重复代码。
程序实例:考试时使用同一种考卷(父类),不同学生上交自己填写的试卷(子类方法的实现)
package main
import (
"fmt"
)
type TestPaper struct {
child interface{}
}
func (t *TestPaper) testQuestion1() {
fmt.Println("杨过得到,后来给了郭靖,练成倚天剑、屠龙刀的玄铁可能是[] a.球磨铸铁 b.马口铁 c.高速合金钥 d.碳素纤维")
fmt.Println("答案:", t.child.(Answers).answer1())
}
func (t *TestPaper) testQuestion2() {
fmt.Println("杨过、程英、陆无双铲除了情花.造成[] a.使这种植物不再害人 b.使一种珍稀物种灭绝 c.破坏了那个生物圈的生态平衡 d.造成该地区沙漠化")
fmt.Println("答案:", t.child.(Answers).answer2())
}
func (t *TestPaper) testQuestion3() {
fmt.Println("蓝凤凰致使华山师徒、桃谷六仙呕吐不止,如果你是大夫,会给他们开什么药[] a.阿司匹林 b.牛黄解毒片 c.氟呱酸 d.让他们喝大量的生牛奶 e.以上全不对")
fmt.Println("答案:", t.child.(Answers).answer3())
}
type Answers interface {
answer1() string
answer2() string
answer3() string
}
type TestPaperA struct {
TestPaper
}
func NewTestPaperA() *TestPaper {
paper := &TestPaper{}
var answer Answers = &TestPaperA{}
paper.child = answer
return paper
}
func (t *TestPaperA) answer1() string {
return "b"
}
func (t *TestPaperA) answer2() string {
return "c"
}
func (t *TestPaperA) answer3() string {
return "a"
}
type TestPaperB struct {
TestPaper
}
func NewTestPaperB() *TestPaper {
paper := &TestPaper{}
var answer Answers = &TestPaperB{}
paper.child = answer
return paper
}
func (t *TestPaperB) answer1() string {
return "c"
}
func (t *TestPaperB) answer2() string {
return "a"
}
func (t *TestPaperB) answer3() string {
return "a"
}
func main() {
studentA := NewTestPaperA()
studentA.testQuestion1()
studentA.testQuestion2()
studentA.testQuestion3()
studentB := NewTestPaperB()
studentB.testQuestion1()
studentB.testQuestion2()
studentB.testQuestion3()
}
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信7629 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
模式特点:通过吧不变的行为搬到父类,去除子类中的重复代码。
程序实例:考试时使用同一种考卷(父类),不同学生上交自己填写的试卷(子类方法的实现)
package main
import (
"fmt"
)
type TestPaper struct {
child interface{}
}
func (t *TestPaper) testQuestion1() {
fmt.Println("杨过得到,后来给了郭靖,练成倚天剑、屠龙刀的玄铁可能是[] a.球磨铸铁 b.马口铁 c.高速合金钥 d.碳素纤维")
fmt.Println("答案:", t.child.(Answers).answer1())
}
func (t *TestPaper) testQuestion2() {
fmt.Println("杨过、程英、陆无双铲除了情花.造成[] a.使这种植物不再害人 b.使一种珍稀物种灭绝 c.破坏了那个生物圈的生态平衡 d.造成该地区沙漠化")
fmt.Println("答案:", t.child.(Answers).answer2())
}
func (t *TestPaper) testQuestion3() {
fmt.Println("蓝凤凰致使华山师徒、桃谷六仙呕吐不止,如果你是大夫,会给他们开什么药[] a.阿司匹林 b.牛黄解毒片 c.氟呱酸 d.让他们喝大量的生牛奶 e.以上全不对")
fmt.Println("答案:", t.child.(Answers).answer3())
}
type Answers interface {
answer1() string
answer2() string
answer3() string
}
type TestPaperA struct {
TestPaper
}
func NewTestPaperA() *TestPaper {
paper := &TestPaper{}
var answer Answers = &TestPaperA{}
paper.child = answer
return paper
}
func (t *TestPaperA) answer1() string {
return "b"
}
func (t *TestPaperA) answer2() string {
return "c"
}
func (t *TestPaperA) answer3() string {
return "a"
}
type TestPaperB struct {
TestPaper
}
func NewTestPaperB() *TestPaper {
paper := &TestPaper{}
var answer Answers = &TestPaperB{}
paper.child = answer
return paper
}
func (t *TestPaperB) answer1() string {
return "c"
}
func (t *TestPaperB) answer2() string {
return "a"
}
func (t *TestPaperB) answer3() string {
return "a"
}
func main() {
studentA := NewTestPaperA()
studentA.testQuestion1()
studentA.testQuestion2()
studentA.testQuestion3()
studentB := NewTestPaperB()
studentB.testQuestion1()
studentB.testQuestion2()
studentB.testQuestion3()
}