23.设计模式.模板方法模式(Template)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学生甲的试卷
武汉科技大学
www.wust.edu.cn
问题(Problem)
class TestPaperB { //试题1 public void TestQuestion1() { Console.WriteLine(" 杨过得到,后来给了郭靖,炼成倚天剑、屠龙刀的玄铁 可能是[ ] a.球磨铸铁 b.马口铁 c.高速合金钢 d.碳素纤维 "); Console.WriteLine("答案:d"); } //试题2 public void TestQuestion2() { Console.WriteLine(" 杨过、程英、陆无双铲除了情花,造成[ ] a.使这种植物不再害人 b.使一种珍稀物种灭绝 c.破坏了那个生物圈的生态平衡 d.造成该地区沙漠化 "); Console.WriteLine("答案:b"); } //试题3 public void TestQuestion3() { Console.WriteLine(" 蓝凤凰的致使华山师徒、桃谷六仙呕吐不止,如果你是大夫,会给他们 开什么药[ ] a.阿司匹林 b.牛黄解毒片 c.氟哌酸 d.让他们喝大量的生牛奶 e.以上全不对 "); Console.WriteLine("答案:a"); } }
设计模式(Design Pattern)
张凯 副教授 计算机学院 软件工程系
LOGO
武汉科技大学
www.wust.edu.cn
问题(Problem) 题目抄错,会做也白搭
武汉科技大学
www.wust.edu.cn
问题(Problem)
class TestPaperA { //试题1 public void TestQuestion1() { Console.WriteLine(" 杨过得到,后来给了郭靖,炼成倚天剑、屠龙刀的玄铁 可能是[ ] a.球磨铸铁 b.马口铁 c.高速合金钢 d.碳素纤维 "); Console.WriteLine("答案:b"); } //试题2 public void TestQuestion2() { Console.WriteLine(" 杨过、程英、陆无双铲除了情花,造成[ ] a.使这种植物不再害人 b.使一种珍稀物种灭绝 c.破坏了那个生物圈的生态平衡 d.造成该地区沙漠化 "); Console.WriteLine("答案:a"); } //试题3 public void TestQuestion3() { Console.WriteLine(" 蓝凤凰的致使华山师徒、桃谷六仙呕吐不止,如果你是大夫,会给他们 开什么药[ ] a.阿司匹林 b.牛黄解毒片 c.氟哌酸 d.让他们喝大量的生牛奶 e.以上全不对 "); Console.WriteLine("答案:c"); } }
方法(primitive method);而将这些基本法方法总
汇起来的方法叫做模版方法(template method), 这个设计模式的名字就是从此而来。
武汉科技大学
www.wust.edu.cn
模板方法模式(Template Method) 模式定义
模板方法(Template Method):定义一个操作中算法的 骨架,而将一些 步骤延迟到子类中。模板方法使得子 类可以不改变一个算法的结构即可重定义该算法的某 些特定步骤。模板方法是一种类行为型模式。
现这些抽象方法,从而对剩余的逻辑有不同的实现。
这就是模版方法模式的用意。
武汉科技大学
www.wust.edu.cn
模板方法模式(Template Method) 模式动机
很多人可能没有想到,模版方法模式实际上是所有模 式中最为常见的几个模式之一,而且很多人可能使用 过模版方法模式而没有意识到自己已经使用了这个模 式。模版方法模式是基于继承的代码复用的基本技术,
学生乙的试卷
武汉科技大学
www.wust.edu.cn
问题(Problem)
static void Main(string[] args) { Console.WriteLine("学生甲的试卷:"); TestPaperA studentA = new TestPaperA(); studentA.TestQuestion1(); studentA.TestQuestion2(); studentA.TestQuestion3(); Console.WriteLine("学生乙的试卷:"); TestPaperB studentB = new TestPaperB(); studentB.TestQuestion1(); studentB.TestQuestion2(); studentB.TestQuestion3(); Console.Read();
武汉科技大学
www.wust.edu.cn
模板方法模式(Template Method) 模式结构
AbstractClass
+TemplateMethod() +PrimitiveOperation1() +PrimitiveOperation2()
ConcreteClass +PrimitiveOperation1() +PrimitiveOperation2()
}
}
武汉科技大学
www.wust.edu.cn
问题(Problem)
class TestPLeabharlann Baiduper { public void TestQuestion1() { Console.WriteLine(" 杨过得到,后来给了郭靖,炼成倚天剑、屠龙 刀的玄铁可能是[ ] a.球磨铸铁 b.马口铁 c.高速合金钢 d.碳素纤维 "); Console.WriteLine("答案:" + Answer1()); } protected virtual string Answer1() { return ""; }
学生乙的试卷
class TestPaperB : TestPaper { public new void TestQuestion1() { base.TestQuestion1(); Console.WriteLine("答案:d"); } public new void TestQuestion2() { base.TestQuestion2(); Console.WriteLine("答案:c"); } public new void TestQuestion3() { base.TestQuestion3(); Console.WriteLine("答案:a"); }
武汉科技大学
www.wust.edu.cn
主要内容
1 2
模式动机与定义 模式结构与分析
模式实例与解析 模式效果与应用
3 4
武汉科技大学
www.wust.edu.cn
模板方法模式(Template Method) 模式动机
模式名称:模板方法模式(Template Method) 准备一个抽象类,将部分逻辑以具体方法以及具体构 造函数的形式实现,然后声明一些抽象方法来迫使子 类实现剩余的逻辑。不同的子类可以以不同的方式实
试卷父类
武汉科技大学
www.wust.edu.cn
问题(Problem)
学生甲的试卷
class TestPaperA : TestPaper { public new void TestQuestion1() { base.TestQuestion1(); Console.WriteLine("答案:c"); } public new void TestQuestion2() { base.TestQuestion2(); Console.WriteLine("答案:b"); } public new void TestQuestion3() { base.TestQuestion3(); Console.WriteLine("答案:a"); }
武汉科技大学
www.wust.edu.cn
模板方法模式(Template Method) 参与者
AbstractClass:抽象类 ConcreteClass:具体子类
protected override string Answer3() { return "a"; }
}
}
武汉科技大学
www.wust.edu.cn
问题(Problem)
金庸小说考题试卷
+试题1() +试题2() +试题3() #答案1() #答案2() #答案3()
学生甲的试卷 #答案1() #答案2() #答案3()
学生乙的试卷 #答案1() #答案2() #答案3()
武汉科技大学
www.wust.edu.cn
问题(Problem)
static void Main(string[] args) { Console.WriteLine("学生甲抄的试卷:"); TestPaper studentA = new TestPaperA(); studentA.TestQuestion1(); studentA.TestQuestion2(); studentA.TestQuestion3();
protected override string Answer2() { return "c"; }
protected override string Answer3() { return "a"; }
protected override string Answer2() { return "a"; }
Console.WriteLine("学生乙抄的试卷:"); TestPaper studentB = new TestPaperB(); studentB.TestQuestion1(); studentB.TestQuestion2(); studentB.TestQuestion3();
} Console.Read();
}
武汉科技大学
www.wust.edu.cn
问题(Problem)
//学生甲抄的试卷 class TestPaperA : TestPaper { protected override string Answer1() { return "b"; } //学生乙抄的试卷 class TestPaperB : TestPaper { protected override string Answer1() { return "c"; }
学生甲和学生乙的试卷类非常类似, 除了答案不同,没什么区别,如果老 师修改题目,2个类都需要修改。
}
武汉科技大学
www.wust.edu.cn
问题(Problem)
class TestPaper { //试题1 public void TestQuestion1() { Console.WriteLine(" 杨过得到,后来给了郭靖,炼成倚天剑、屠龙刀的玄铁 可能是[ ] a.球磨铸铁 b.马口铁 c.高速合金钢 d.碳素纤维 "); Console.WriteLine("答案:b"); } //试题2 public void TestQuestion2() { Console.WriteLine(" 杨过、程英、陆无双铲除了情花,造成[ ] a.使这种植物不再害人 b.使一种珍稀物种灭绝 c.破坏了那个生物圈的生态平衡 d.造成该地区沙漠化 "); Console.WriteLine("答案:a"); } //试题3 public void TestQuestion3() { Console.WriteLine(" 蓝凤凰的致使华山师徒、桃谷六仙呕吐不止,如果你是大夫,会给他们 开什么药[ ] a.阿司匹林 b.牛黄解毒片 c.氟哌酸 d.让他们喝大量的生牛奶 e.以上全不对 "); Console.WriteLine("答案:c"); } }
模版方法模式的结构和用法也是面向对象设计的核心。
武汉科技大学
www.wust.edu.cn
模板方法模式(Template Method) 模式动机
模版方法模式需要开发抽象类和具体子类的设计师 之间的协作。一个设计师负 责给出一个算法的轮廓 和骨架,另一些设计师则负责给出这个算法的各个 逻辑步骤。代表这些具体逻辑步骤的方法称做基本