补-计划模式之模板方法模式(八)

藏宝库编辑 2024-10-3 08:53:36 21 0 来自 中国
1.png   模板方法模式是界说一个操作中算法的骨架,而将一些步调耽误到子类中,模板方法使得子类可以不改变算法的布局即可重界说该算法的某些特定步调。
  通俗点的理讲授就是完成一件变乱,有固定的数个步调,但是每个步调根据对象的差别,而实现细节差别;就可以在父类中界说一个完成该变乱的总方法,按照完成变乱须要的步调去调用其每个步调的实现方法。每个步调的详细实现,由子类完成。



  • 抽象类模板
     实现了模板方法,界说了算法的骨架。
  • 详细类模板
     实现抽象类中的抽象方法,即差别的对象的详细实现细节。
3.png
小A和小B去到场考试的故事。


  • 这是A的问卷:
public class TestPageA {// 试题1public void testQuestion1() {    System.out.println("杨过得到,厥后给了郭靖,炼成倚天剑、屠龙刀的玄铁大概是()a.球磨铸铁 b.马口铁 c.高速合金钢 " +            "碳素纤维");    System.out.println("答案:b");}// 试题2public void testQuestion2 () {    System.out.println("杨过、程英、陆无双铲除了情花,造成[] a. 使这莳植物不再害人b.使种珍稀物种灭尽" +            "C. 粉碎了谁人生物圈的生态平衡d. 造成该地区戈壁化");    System.out.println(" 答案: a");}// 试题3public void testQuestion3() {    System.out.println("蓝凤凰致使西岳师徒、桃谷六仙咽吐不止,假如你是医生,会给他们开什么药[ 1a.阿司匹林b.牛黄解毒片c.氟账酸d.让他们喝大量的生牛奶e.以上:全不对");    System.out.println("答案: c");}}

  • 这是B的问卷:
public class TestPageB {// 试题1public void testQuestion1() {    System.out.println("杨过得到,厥后给了郭靖,炼成倚天剑、屠龙刀的玄铁大概是()a.球磨铸铁 b.马口铁 c.高速合金钢 " +            "碳素纤维");    System.out.println("答案:a");}// 试题2public void testQuestion2 () {    System.out.println("杨过、程英、陆无双铲除了情花,造成[] a. 使这莳植物不再害人b.使种珍稀物种灭尽" +            "C. 粉碎了谁人生物圈的生态平衡d. 造成该地区戈壁化");    System.out.println(" 答案: b");}// 试题3public void testQuestion3() {    System.out.println("蓝凤凰致使西岳师徒、桃谷六仙咽吐不止,假如你是医生,会给他们开什么药[ 1a.阿司匹林b.牛黄解毒片c.氟账酸d.让他们喝大量的生牛奶e.以上:全不对");    System.out.println("答案: a");}}

  • 测试类:
public class Test {public  static  void main(String[] args) {    System.out.println("小A的试卷");    TestPageA testPageA = new TestPageA();    testPageA.testQuestion1();    testPageA.testQuestion2();    testPageA.testQuestion3();    System.out.println("小B的试卷");    TestPageB testPageB = new TestPageB();    testPageB.testQuestion1();    testPageB.testQuestion2();    testPageB.testQuestion3();}}  通过上面的代码我们可以看出小A和小B的试卷除了答案不类似,没什么不一样,如许写又容易堕落,又难以维护。假如老师要更改题目,那么两个人都要更改代码。接下来我们用模板方法的方式办理。

4.png

  • 抽象类脚色:
public abstract class TestPage {public void testQuestion1() {    System.out.println("杨过得到,厥后给了郭靖,炼成倚天剑、屠龙刀的玄铁大概是()a.球磨铸铁 b.马口铁 c.高速合金钢 " +            "碳素纤维");    if (isAnswer()) {        System.out.println("答案:"+answer1());    } else {        System.out.println("答案:同砚未填写答案");    }}public void testQuestion2 () {    System.out.println("杨过、程英、陆无双铲除了情花,造成[] a. 使这莳植物不再害人b.使种珍稀物种灭尽" +            "C. 粉碎了谁人生物圈的生态平衡d. 造成该地区戈壁化");    System.out.println("答案:"+answer2());}// 试题3public void testQuestion3() {    System.out.println("蓝凤凰致使西岳师徒、桃谷六仙咽吐不止,假如你是医生,会给他们开什么药[ 1a.阿司匹林b.牛黄解毒片c.氟账酸d.让他们喝大量的生牛奶e.以上:全不对");    System.out.println("答案: "+answer3());}// 答复题目方法1public abstract String answer1();// 答复题目方法2public abstract String answer2();// 答复题目方法3public abstract String answer3();// 是否填写答案public abstract boolean isAnswer () ;}

  • 详细类(小A):
public class TestPageA extends TestPage{@Overridepublic String answer1() {    return "b";}@Overridepublic String answer2() {    return "a";}@Overridepublic String answer3() {    return "c";}@Overridepublic boolean isAnswer() {    return false;}}

  • 详细类(小B)
public class TestPageB extends TestPage {@Overridepublic String answer1() {    return "a";}@Overridepublic String answer2() {    return "b";}@Overridepublic String answer3() {    return "a";}@Overridepublic boolean isAnswer() {    return true;}}

  • 测试类
public class Test {public  static  void main(String[] args) {    System.out.println("---------小A的试卷--------");    TestPage testPageA = new TestPageA();    testPageA.testQuestion1();    testPageA.testQuestion2();    testPageA.testQuestion3();    System.out.println("---------小B的试卷---------");    TestPage testPageB = new TestPageB();    testPageB.testQuestion1();    testPageB.testQuestion2();    testPageB.testQuestion3();}}  此时更多的学生来答复试卷,只不外在试卷答案模板上填写选择题的答案,这是每个人唯一的同。在代码中添加的isAnswer方法在模板方法模式也称钩子方法,通过子类覆盖父类的钩子方法来决定某一特定步调是否须要实行。


  模板方法模式是通过把稳固的举动搬移到抽象类,去除子类中的重复代码。

长处:
  模板方法模式在一个类中界说算法,而由它的子类实现细节的处置惩罚。
  模板方法是一种代码复用的基本技能。它们在类库中尤为告急,它们提取了类库中的公共举动。
  模板方法模式导致一种反向的控制布局,这种布局偶然被称为“好莱坞法则” ,即“别找我们,,我们找你”通过一个父类调用其子类的操作(而不是相反的子类调用父类),通过对子类的扩展增长新的举动,符合“开闭原则”。
缺点:
  每个差别的实现都须要界说一个子类,这会导致类的个数增长,体系更加巨大,计划也更加抽象,但是更加符合“单一职责原则”,使得类的内聚性得以进步。


  Servlet(Server Applet)是Java Servlet的简称,用Java编写的服务器端步伐,告急功能在于交互式地欣赏和修改数据,生成动态Web内容。在每一个 Servlet 都必须要实现 Servlet 接口,GenericServlet 是个通用的、不特定于任何协议的Servlet,它实现了 Servlet 接口,而 HttpServlet 继续于 GenericServlet,实现了 Servlet 接口,为 Servlet 接口提供了处置惩罚HTTP协议的通用实现,以是我们界说的 Servlet 只须要继续 HttpServlet 即可。
  在 HttpServlet 的 service方法中,起首得到到哀求的方法名,然后根据方法名调用对应的doXXX方法,比如说哀求方法为GET,那么就去调用doGet方法;哀求方法为POST,那么就去调用doPost方法,HttpServlet 相当于界说了一套处置惩罚 HTTP哀求的模板;service方法为模板方法,界说了处置惩罚HTTP哀求的基本流程;doXXX 等方法为基本方法,根据哀求方法做相应的处置惩罚,子类可重写这些方法;HttpServletRequest 中的Method则起到钩子方法的作用。

  对一些复杂的算法举行分割,将其算法中固定稳固的部门计划为模板方法和父类详细方法,而一些可以改变的细节由其子类来实现。
  子类中公共的举动提取出来并会合到一个抽象类中以克制代码重复。
  通过子类来决定父类算法中某个步调是否实行,实现子类对父类的反向控制。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 16:53, Processed in 0.122691 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表