`

模版模式

阅读更多

     今天看书,看到了模版模式,就顺便复习一下,模版模式是父类建立骨架,而子类具体实现其方法。它是把不变的行为搬移到了父类,去除了子类重复的代码,它提供了一个很好的代码复用的平台。当不变的行为和可变的行为在子类中混合在一起的时候,不变的行为就会在代码中重复。通过模版方法行为把重复的行为转移到单一的地方,这样就帮助子类摆脱重复代码的纠缠。

例如:一个复杂的例子用模版模式是如何实现的。考生做试题,传统的方法是这样的,两个人做答其代码是这个样子的

/**
 * 
 * @功能     
 * @创建人   gao_jie
 * @创建日期 Jun 17, 2009
 * @版本     1.0
 * 
 */
public class TestPaperA {
	public void questionA(){
		System.out.println("题目A");
		System.out.println("你喜欢我吗? A:喜欢 B: 不喜欢");
		System.out.println("答案:B");
	}
	public void questionB(){
		System.out.println("题目B");
		System.out.println("你喜欢游泳吗? A:喜欢 B: 不喜欢");
		System.out.println("答案:B");
	}
}

 

/**
 * 
 * @功能     
 * @创建人   gao_jie
 * @创建日期 Jun 17, 2009
 * @版本     1.0
 * 
 */
public class TestPaperB {
	public void questionA(){
		System.out.println("题目A");
		System.out.println("你喜欢我吗? A:喜欢 B: 不喜欢");
		System.out.println("答案:A");
	}
	public void questionB(){
		System.out.println("题目B");
		System.out.println("你喜欢游泳吗? A:喜欢 B: 不喜欢");
		System.out.println("答案:A");
	}
}

 

/**
 * 
 * @功能
 * @创建人 gao_jie
 * @创建日期 Jun 17, 2009
 * @版本 1.0
 * 
 */
public class Test {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		TestPaperA PaperA = new TestPaperA();
		PaperA.questionA();
		PaperA.questionB();
		TestPaperB PaperB = new TestPaperB();
		PaperB.questionA();
		PaperB.questionB();
	}
}

 结果如下:

题目A
你喜欢我吗? A:喜欢 B: 不喜欢
答案:B
题目B
你喜欢游泳吗? A:喜欢 B: 不喜欢
答案:B
题目A
你喜欢我吗? A:喜欢 B: 不喜欢
答案:A
题目B
你喜欢游泳吗? A:喜欢 B: 不喜欢
答案:A

大家可以看出,两份卷子都包含重复的题目,如果我们把重复的公共的东西提取出来,放到一个父类中,重复代码会减少。如下所示。

/**
 * 
 * @功能 抽象模版类
 * @创建人 gao_jie
 * @创建日期 Jun 17, 2009
 * @版本 1.0
 * 
 */
public abstract class AbstractTestPaper {
	/**
	 * 公共方法1模版1
	 */
	public void questionA() {
		System.out.println("题目A");
		System.out.println("你喜欢我吗? A:喜欢 B: 不喜欢");
		answerA();
	}
	/**
	 * 公共方法2模版2
	 */
	public void questionB() {
		System.out.println("题目B");
		System.out.println("你喜欢游泳吗? A:喜欢 B: 不喜欢");
		answerB();
	}
	/**
	 * 抽象方法1
	 */
	public abstract void answerA();
	/**
	 * 抽象方法2
	 */
	public abstract void answerB();
}

 

/**
 * 
 * @功能     
 * @创建人   gao_jie
 * @创建日期 Jun 17, 2009
 * @版本     1.0
 * 
 */
public class TestPaperA extends AbstractTestPaper{
	@Override
	public void answerA() {
		System.out.println("答案: A");	
	}
	@Override
	public void answerB() {
		System.out.println("答案: A");	
	}
}

 

/**
 * 
 * @功能
 * @创建人 gao_jie
 * @创建日期 Jun 17, 2009
 * @版本 1.0
 * 
 */
public class TestPaperB extends AbstractTestPaper {
	@Override
	public void answerA() {
		System.out.println("答案: B");
	}
	@Override
	public void answerB() {
		System.out.println("答案: B");
	}
}

 

测试类

/**
 * 
 * @功能
 * @创建人 gao_jie
 * @创建日期 Jun 17, 2009
 * @版本 1.0
 * 
 */
public class Test {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		AbstractTestPaper PaperA = new TestPaperA();
		PaperA.questionA();
		PaperA.questionB();
		AbstractTestPaper PaperB = new TestPaperB();
		PaperB.questionA();
		PaperB.questionB();
	}
}

 

结果

题目A
你喜欢我吗? A:喜欢 B: 不喜欢
答案: A
题目B
你喜欢游泳吗? A:喜欢 B: 不喜欢
答案: A
题目A
你喜欢我吗? A:喜欢 B: 不喜欢
答案: B
题目B
你喜欢游泳吗? A:喜欢 B: 不喜欢
答案: B

而后面所用的方法就是设计模式中的模版方法。该方法的UML图为

 



 

  • 大小: 30.5 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

Global site tag (gtag.js) - Google Analytics