模板模式
定义抽象类的目的是提供可由其子类共享的一般形式,子类可以根据自身需要扩展抽象类
什么是模板模式
在模板模式Template Pattern中一个抽象类公开定义了总体的算法【算法骨架】,把没有办法在父类中实现的方法 延迟到子类中具体实现。这种类型的设计模式属于行为型模式
何时使用
有多个子类共有的方法,且逻辑相同
重要的、复杂的方法,可以考虑作为模板方法
注意事项
为防止恶意操作,一般模板方法都加上final 关键词
优点
- 封装不变部分,扩展可变部分
- 提取公共代码,便于维护
- 行为由父类控制,子类实现。
缺点
- 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
分析
冒泡排序算法固定可以定义在父类中,但是两个比较的算法不同确定,所以可以将具体比较算法延迟到子类中实 现。抽象父类中定义算法模板,具体的比较延迟到子类中进行实现
public abstract class BubbleSorter {
//在父类中固化算法实现,没有办法实现的比较方法延迟到子类中提供实现
public final void sort(Object[] arr){ //final表示这个方法是最终方法,不允许子类覆盖
for(int i=1;i<arr.length;i++){
for(int k=0;k<arr.length-i;k++){
if(bigger(arr[k], arr[k+1])){
Object temp=arr[k];
arr[k]=arr[k+1];
arr[k+1]=temp;
}
}
}
}
//定义protected目的在于子类中提供实现
protected abstract boolean bigger(Object obj1,Object obj2);
}
具体的比较器,抽象父类的目的在于固化算法实现final
//专门用于对int类型数据进行冒泡排序
public class IntSorter extends BubbleSorter {
@Override
protected boolean bigger(Object obj1, Object obj2) {
if(obj1!=null && obj2!=null) {
if(obj1 instanceof Integer && obj2 instanceof Integer) {
//不用简单写法
int k1=(Integer)obj1;
int k2=(Integer)obj2;
return k1>k2;
}
return false;
}
}
测试调用
public class A {
public static void main(String[] args) {
Object[] arr=new Integer[10];
Random r=new Random();
for(int i=0;i<arr.length;i++)
arr[i]=r.nextInt(100);
for(Object temp:arr)
System.out.print(temp+"\t");
System.out.println();
IntSorter is=new IntSorter();//是否可以使用BubbleSorter定义is类型? 可以。抽象类只是不允许 直接new,但是仍旧可以用于声明变量类型。例如前面一直使用的Number就是抽象类
is.sort(arr);
for(Object temp:arr)
System.out.print(temp+"\t");
System.out.println();
}
}