Chinaunix首页 | 论坛 | 博客
  • 博客访问: 294567
  • 博文数量: 69
  • 博客积分: 2946
  • 博客等级: 少校
  • 技术积分: 800
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-09 04:15
文章分类

全部博文(69)

文章存档

2013年(6)

2012年(16)

2011年(18)

2010年(29)

分类: Java

2013-01-17 15:18:02

这篇博客主要用来讲述模板方法模式。模板模式是比较早的一种设计模式,在OO出现的时候,人们便想办法将共同代码提取出来,放到公共的部分,然后不同的部分分别在不同的子类中来实现,是基于继承代码复用的技术。

模板方法模式结构图:

 image 图.1

模版方法模式关键点在于抽象父类。抽象父类在模板方法中规定了顶级逻辑,顶级逻辑由许多具体的方法来实现完成。在抽象父类中,规定好具体方法的接口参数,但并不给出其具体的实现。继承抽象父类的子类根据不同的需求再来实现各种具体的方法。就像做房子的总设计师一样,他只勾勒出整个房子的大体骨架,但是不给出这栋房子中每个房间怎么设计,房子内部结构的设计细节,这些工作就交给了下面具体设计师。具体设计师在总设计师已经完成设计的基础之上,然后完成剩下的房子内部细节设计。细节设计师不能违背或者修改总设计师的设计,只能在其基础之上进一步的细化设计,使之成为一个完整的房子设计图,最终付诸实施。

模版方法模式主要涉及到两个角色-抽象模板和具体模板。

抽象模板,定义了模式中顶级的逻辑操作,子类继承实现抽象模板中尚未实现的抽象方法。但是抽象模板中一般给出了顶级逻辑操作,而且会声明为final,子类不能覆写该顶级逻辑操作;

具体模板,继承抽象模版,具体实现抽象模板中声明的抽象方法。多个具体模版继承自抽象父类,按照不同的需求实现抽象父类中声明的抽象方法,按照顶级逻辑的执行顺序完成所需的功能。

本文将举一个简单的示例,是在实际中遇到的一个小问题。国密局制定的SM2算法标准是带ID的,但是在实际应用中,有些是不带ID,有些事带ID的,所以在某些情况下签名时需要带ID,但是有些情况签名又不需要带ID。

抽象模板:

public abstract class AbstractTemplate {
	
	public void Sign(){
		hash();
		signature();
	}
    
	public abstract void hash();
	public void signature(){};
	public void hook(){};
}

具体模板:

public class ConcreteTemplate extends AbstractTemplate {

	public void hash() {
             //with ID 
	}
}

具体模板:

public class ConcreteTemplate2 extends AbstractTemplate{

	public void hash(){
		//without id
	}
}

具体模板继承自抽象的模板,将抽象模板中的抽象方法按照不同的需求来实现(带ID的哈希和不带ID的哈希)。然后按照顶级逻辑中的计算步骤,对哈希值进行签名,完成整个计算过程。

模板方法模式使用的继承机制。虽然OO提倡多用组合少用继承,但是该模式是对继承的有效合理的利用,达到很好的设计效果。

阅读(1300) | 评论(0) | 转发(0) |
0

上一篇:编程语言历史

下一篇:设计模式-策略模式

给主人留下些什么吧!~~