厦门做百度推广的网站,东莞网站的关键字推广,王占山七一勋章颁奖词,网站建设定制公众号小程序介绍
GOF 定义
模板方法模式 Template Method Design Pattern #xff1a;模板方法模式在一个方法中定义一个算法骨架#xff0c;并将某些步骤推迟到子类中去实现#xff1b;模板方法在不改变算法整体结构的情况下#xff0c;可以重新定义算法中的某些步骤。
代码举例
…介绍
GOF 定义
模板方法模式 Template Method Design Pattern 模板方法模式在一个方法中定义一个算法骨架并将某些步骤推迟到子类中去实现模板方法在不改变算法整体结构·的情况下可以重新定义算法中的某些步骤。
代码举例
public abstract class AbstractClass{//算法框架方法使用final避免子类重写public final void templateMethod(){...method1();...method2();}//使用protect保证子类可见包外不可见protect abstract void method1();//使用protect abstract void method2();
}public class ConcreteClass2 extends AbstractClass{Overrideprotected void method1(){...具体实现}Overrideprotected void method2(){...具体实现}
}应用案例
模板方法的作用 1复用
InputStream 的案例 InputStream 中有一个模板方法方法签名是read(byte[]int offint len);其中包含一个抽象方法 read()的调用这个方法则留待子类去实现。实现了方法 read(byte[]int offint len); 的复用不需要每个子类都重复实现。 Java AbstractList 的案例 AbstractList 中的 addAll 方法中调用了 add 方法这就是一个模板方法add 的具体实现依赖于子类的实现。虽然 AbstractList 中没有将 add 方法声明为抽象但是 add 方法在 AbstractList 中直接抛出了异常
public boolean addAll(int index, Collection? extends E c) {rangeCheckForAdd(index);boolean modified false;for (E e : c) {add(index, e);modified true;}return modified;
}public void add(int index, E element) {throw new UnsupportedOperationException();
}模板方法的作用 2拓展点
模板方法还可以用作框架的拓展点例如 Spring MVC WEB 开发中底层使用的 Servlet 技术 直接使用 Servlet 开发时继承 HttpServlet 类后手写 doGet 和 doPOst 方法。然后服务请求进入 Servlet 时实际上调用的 service 方法。这个 service 方法就可以看做一个模板方法。
模板方法与回调的对比
相同点
回调方法与模板方法的应用场景几乎一致都是在一个大的算法框架中自由替换其中的某个步骤起到代码复用和拓展的作用。
不同点
回调基于组合关系而模板方法基于继承实现回调的组合关系更加灵活 Java 语言的单继承限制回调可以使用匿名类Lambda 表达式来传递代码。但是模板方法必须定义子类模板方法不够灵活如果有多个模板方法和其待实现方法则实现子类必须都实现一遍。
总结
优点
提高代码复用不变的部分集中在父类减少代码重复。提高扩展性新增子类时只需实现特定的方法无需改动模板方法。保证一致性确保算法的整体结构稳定即使在子类中修改了某些步骤。
缺点
过度使用可能导致类结构复杂特别是继承层次过深时。对于不需要重用算法结构的情况引入模板方法可能会增加不必要的抽象。