【设计模式】模板方法模式的实现--------java

23 篇文章 0 订阅
22 篇文章 0 订阅

模板方法模式:父类中定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。

动机:对于某一项任务,整体的操作步骤顺序固定,但具体步骤的内容有所不同时。

1.问题引入:标准化考试:
实现考试题相同,每个人的解答不同。
在这里插入图片描述

package computer;

public class Test {
	public static void main(String[] args) {
		System.out.println("学生A答的试卷:");
		//子类变量的声明改成父类,利用多态性,实现代码重用
		TestPaper A=new TestPaperA();
		A.testQuestion1();
		A.testQuestion2();
		A.testQuestion3();
		
		System.out.println("=================================================================");
		
		System.out.println("学生B答的试卷:");
		TestPaper B=new TestPaperB();
		B.testQuestion1();
		B.testQuestion2();
		B.testQuestion3();
	}

}

//父类(规定了题目)(建立模板)
class TestPaper{
	public void testQuestion1() {
		System.out.println("杨过得到,后来给了郭靖,炼成倚天剑、屠龙刀的玄铁可能是:()");
		System.out.println("A.球墨铸铁  B.马口铁  C.高速合金钢  D.碳素纤维");
		System.out.println("答案:"+answer1());
	}
	
	public void testQuestion2() {
		System.out.println("杨过、程英、陆无双铲除了情花,造成:()");
		System.out.println("A.使这种植物不再害人  B.使一种珍惜物种灭绝  C.破环了生物圈的生态平衡  D.造成该地区沙漠化");
		System.out.println("答案:"+answer2());
	}
	
	public void testQuestion3() {
		System.out.println("如果你是大天,你会开什么药:()");
		System.out.println("A.阿司匹林  B.牛黄解毒片  C.氟哌酸  D.喝大量牛奶  E.以上均不正确");
		System.out.println("答案:"+answer3());
	}
	
	protected String answer1() {
		return "";
	}
	
	protected String answer2() {
		return "";
	}
	
	protected String answer3() {
		return "";
	}
}

//学生A答的试卷
class TestPaperA extends TestPaper{
	protected String answer1() {
		return "B";
	}
	
	protected String answer2() {
		return "C";
	}
	
	protected String answer3() {
		return "A";
	}
}

//学生B答的试卷(只需要填上答案)
class TestPaperB extends TestPaper{
	protected String answer1() {
		return "C";
	}
	
	protected String answer2() {
		return "A";
	}
	
	protected String answer3() {
		return "A";
	}
}

2.模板方法模式
在这里插入图片描述

package computer;

public class Test {
	public static void main(String[] args) {
		AbstractClass c;
		
		c=new ConcreteClassA();
		c.TemplateMethod();
		
		c=new ConcreteClassB();
		c.TemplateMethod();
	}

}

abstract class AbstractClass{
	//一些抽象行为,放到子类中去实现
	public abstract void operation1();
	public abstract void operation2();
	
	//模板方法,给出了逻辑的骨架,而逻辑的组成是一些相应的抽象操作,他们都推迟到了子类实现
	public void TemplateMethod() {
		operation1();
		operation2();
		System.out.println("");
	}
}

//具体的类A
class ConcreteClassA extends AbstractClass{

	public void operation1() {
		System.out.println("具体类A方法1的实现。");
	}

	public void operation2() {
		System.out.println("具体类A方法2的实现。");
	}
	
}

//具体的类B
class ConcreteClassB extends AbstractClass{

	public void operation1() {
		System.out.println("具体类B方法1的实现。");
	}

	public void operation2() {
		System.out.println("具体类B方法2的实现。");
	}
	
}

模板方法模式:不变行为搬到超类中,去除子类中的重复代码。
优点:实现代码复用。
缺点:算法骨架不容易升级。(模板和子类是非常耦合的,若变更模板中的算法骨架,会影响子类变化)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值