设计模式
设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格和解决问题的思考方法,就像是武功秘籍中面对不同敌人时有不同的招式去应对。我们学会后,可以直接选择不同的模式处理不同问题。常见的模式如下:
类型 | 个数 | 模式 |
---|---|---|
创建型模式 | 5 | 工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式 |
结构型模式 | 7 | 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式 |
行为型模式 | 11 | 策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式 、中介者模式、解释器模式 |
本篇文章只介绍模板方法设计模式。
模板方法设计模式
抽象类就是一种经典的模板模式设计,抽象类作为多个子类的通用模板,提供基本的属性和方法,子类在抽象类的基础上进行扩展和改造,但是子类会保留抽象类的行为方式。在软件开发中实现一个算法时,整体步骤很固定,但是某些部分易变,我们将固定的步骤写到父类中,将易变的部分进行抽象,供不同的子类实现。
- 将该类的构造器的访问权限设置为private ,保证其他类不能用new操作符在该类的外部产生该类的对象,而在该类的内部还可以产生对象;
- 因为其他类无法得到该类的对象,只能通过调用该类的某个静态方法以返回该类内部创建的对象;
- 静态方法只能访问该类中的静态成员变量,所以指向该类内部产生的该类对象的变量也必须定义成静态的。
代码实现
public class TemplateTest(){
Template t = new SubTemplate();
t.spendTime();
}
abstract class Template(){
//计算某段代码执行花费的时间
public void spendTime(){
long start = System.currentTimeMillis();
this.code();//不确定的部分、易变的部分
long end = System.currentTimeMillis();
System.out.println("花费的时间为:"+(end-start));
}
public abstract void code();
}
class SubTemplate extends Template{
//将抽象方法具体化,实现输出1000以内的质数
@Override
public void code(){
for(int i =2;i <= 1000;i++){
boolean isFlag = true;
for(int j=2;j <=Math.sqrt(i);j++){
if(i%j == 0){
isFlag = false;
break;
}
}
if(isFlag){
System.out.println(i);
}
}
}
应用场景
1.数据库访问的封装;
2.Junit单元测试;
3.JavaWeb的Servlet中关于doGet/doPost方法调用;
4.Hibernate中模版程序;
4.Spring中JDBCTemplate、HibernateTemplate等。