大话设计模式(golang) 七、模版方法模式

本文通过一个考试场景的例子,展示了如何使用Go语言实现模板设计模式。在这个例子中,父类提供了一个固定的考试问卷,而不同的子类实现了具体的答题逻辑。通过这种方式,可以减少重复代码并提高代码的复用性。

模式特点:通过吧不变的行为搬到父类,去除子类中的重复代码。
程序实例:考试时使用同一种考卷(父类),不同学生上交自己填写的试卷(子类方法的实现)

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()
}

 

转载于:https://my.oschina.net/zhoukuo/blog/714829

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值