基于JAVA的模板设计模式研究

时间:2022-09-10 12:11:50

基于JAVA的模板设计模式研究

摘要:在 Java 面向对象的程序设计中有效地利用模板设计模式, 可以巧妙解决变化对系统带来的影响,使系统扩展性增强。本文重点讨论了模板设计模式的定义与结构,并对其应用进行了深入探讨。

关键词:模板方法;抽象类;具体类

中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)19-30060-03

Studying the Design Model Based on Java

LIU Fan-yan

(Department of Information Engineering, Zhuzhou Professional Technology College, Zhuzhou 410000, China)

Abstract: Programming basic on Java Object Oriented, it would solve skillfully the change to the system, and enhance the system's extend if make full use of the template designing model. The article pays attetion to discuss the defing and structure of the template desinging modle, and lucubrate its application.

Key words: Template Method; Abstract Class; Entitative Class

1 引言

模板设计模式是一个很简单的模式,却被非常广泛的使用。之所以简单是因为在这个模式中仅仅使用到了继承关系。而合理的利用继承关系,能对系统设计起到很好的作用。模板设计模式就是其中的一个使用范例。深入研究模板设计模式能加深对继承的理解,对OO的核心思想有更深更新的认识,熟悉模扳设计模式是重新学习继承的开始[1]。模板设计模式巧妙解决变化对系统带来的影响。使用模板方法能使系统扩展性增强,最小化了变化对系统的影响。

2 定义与结构

GOF给模板方法(Template Method)模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。所谓算法的结构,可以理解为根据需求设计出来的业务流程。而特定的步骤就是指那些可能在内容上存在变化的环节。模板设计模式的简单模式结构为:

1) AbstractClass(抽象类):定义了一到多个的抽象方法,以供具体的子类来实现它们;而且还要实现一个模板方法,来定义一个算法的骨架;

2) ConcreteClass(具体类):实现父类中的抽象方法以完成算法中与特定子类相关的步骤。

图1即为模板设计模式的结构图。

图1 模板设计模式的结构图

3 模板设计模式的应用研究

模板设计模式的应用很多,比如有在线购物功能的网站,经常要对商品进行各种各样的排名:按商品的点击率排名、按商品的购买率排名、按商品的入站时间排名、按商品的类别进行的搜索等等。这些都是一些搜索功能,功能完全相同;不同的要么是搜索的算法。又比如,银行利率的计算,都是利率乘以本金和存款时间,但是,各种存款方式计算利率的方式不同,一般而言,定期的存款利率比活期高,而定期的时间越长,它的利率也越高。因此,我们在设计“银行帐户”这个类的时候,可以将计算利息这个方法定义成抽象方法,在这个方法中,将计算利息的算法的骨架搭建出来,而对于一些细节,推迟到子类中实现。

这个思路的实现方法为:我们给所有类型的帐户定义一个超类LoanAccount,在这个超类中,有一个用于计算利息的方法caculateInterest(),已经将它的算法写好了,这个方法返回一个“本金*利率”的值。但是,因为其中的利率根据存款类型的不同而不同,所以没有具体的实现获得利率的方法,所以将这个获得利率的方法放到具体的子类AccountA及AccountB中去实现,根据不同的子类,设计出不同的获得利率的方法。下面是这个思路的具体实现:

//TestAccoutn.java,该程序已在J2SE中调试通过

abstract class LoanAccount{

public double Interest;//利息

public double fund;//本金

public double calculateInterest(){

Interest=getFund()*getInterestRate();//用于计算利率的算法:本金*利率,但是利率的算法实现并没有在这个类中实现

System.out.println(Interest);

return Interest;}

public void setFund(double fund){

this.fund=fund;}

public double getFund(){

return fund;}

protected abstract double getInterestRate();//不同的存款类型有不同的利率,因此,不在这个父类中实现利率的计算方法,而将它推迟到子类中实现

}

class AccountA extends LoanAccount{

public double getInterestRate(){

return 1.1;

}//实现父类中没有实现的用于获取利率的抽象方法

}

class AccountB extends LoanAccount{

public double getInterestRate(){

return 1.2;

}//实现父类中没有实现的用于获取利率的抽象方法

}

public class TestAccount{

public static void main(String[] args){

LoanAccount accounta=new AccountA();

LoanAccount accountb=new AccountB();

accounta.setFund(1000);

accounta.calculateInterest();

accountb.setFund(1000);

accountb.calculateInterest();

}}

运行结果为:

1100.0

1200.0

4 模板中的方法及模板设计模式的适应情况

4.1 模板中的方法

模板设计模式中有四种方法可用在派生类中:

1) 完整的方法。它完成了所有子类都要用到的一些基本功能。这些方法称为具体的方法;

2) 方法中根本没有内容,必须在派生类中实现的方法。例如,前面说到的getInterestRate()方法;

3) 钩子(hook)方法。这些方法里包含了某些操作的一种默认实现,派生类里可以使用默认也可以重新定义这些方法;

4) 还可以有这样一种方法:它们自己调用抽象方法、钩子方法和具体方法的各种组合。这些方法不仅有待重定义,还描述了一个没有实现细节的算法。

4.2 模板设计模式的适应情况

根据上面对定义的分析,以及例子的说明,可以看出模板方法适用于以下情况:

1) 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现;

2) 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复;

3) 控制子类扩展。模板方法只在特定点调用操作,这样就只允许在这些点进行扩展。比如上例中的getInterestRate()方法。

5 结束语

模板方法模式在OOP程序设计中很常见,它既不复杂也不难理解,在设计中不应该将它考虑得过于复杂。

模板方法模式是为了巧妙解决变化对系统带来的影响而设计的。使用模板方法使系统扩展性增强,使变化对系统的影响最小化。

模板方法模式的第一个要点是,基类可以只定义一些它自己要使用的方法,把其余部分留到派生类中去实现。第二个要点是基类中的方法可以调用一系列的方法,其中有些方法在基类中实现,有些方法在派生类中实现。模板方法定义了一个通用的算法,尽管细节部分在基类中没有完全表现出来。

参考文献:

[1] GOF. thinking in java[M].

[2] 教育部考试中心, 新东方教育科技集团.Java面向对象程序设计[M].

[3] 古凌岚,罗佳,张婵. Java程序设计[M].清华大学出版社,2005.

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文

上一篇:Dr.COM宽带认证客户端与学校机房计费管理系统... 下一篇:多媒体课件中图像的收集与处理