模板模式
定义抽象类的目的是提供可由其子类共享的一般形式,子类可以
根据自身需要扩展抽象类
什么是模板模式
在模板模式Template Pattern中一个抽象类公开定义了总体的算
法,把没有办法在父类中实现的方法延迟到子类中具体实现。这
种类型的设计模式属于行为型模式
意图
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模
板方法使得子类可以不改变一个算法的结构即可重定义该算法的
某些特定步骤。
主要解决
一些方法通用,却在每一个子类都重新写了这一方法。
如何解决
将这些通用算法抽象出来。
使用场景
有多个子类共有的方法,且逻辑相同
重要的、复杂的方法,可以考虑作为模板方法
优点:
- 封装不变部分,扩展可变部分
- 提取公共代码,便于维护
- 行为由父类控制,子类实现。
缺点:
每一个不同的实现都需要一个子类来实现,导致类的个数增加,
使得系统更加庞大。
注意事项
为防止恶意操作,一般模板方法都加上 final 关键词
代码实现:
//父类中固化算法,将父类中无法定义的内容延迟到子类中实现---模板模式
abstract class BubbleSorter {
public final void sort(Object[] arr) {
if (arr == null || arr.length < 1)
return;
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 abstract boolean bigger(Object obj1, Object obj2);
}
===================================================
class IntegerSorter extends BubbleSorter{
protected boolean bigger(Object obj1, Object obj2) {
if(obj1!=null && obj2!=null){
if(obj1 instanceof Integer && obj2 instanceof Integer){
Integer k1=(Integer)obj1;
Integer k2=(Integer)obj2;
return k1>k2;
}
}
return false;
}
}
===================================================
class StringSorter extends BubbleSorter{
protected boolean bigger(Object obj1, Object obj2) {
if(obj1!=null && obj2!=null){
if(obj1 instanceof String && obj2 instanceof String){
String s1=(String)obj1;
String s2=obj2.toString();
return (s1.compareTo(s2)>0);
}
}
return false;
}
}
好处在于:1、避免代码重复。2、避免了人为因素导致的不一致性
建议的使用场景:把通用操作和方法放在父类中,将特殊的方法
定义在子类中。