标签:any play 优点 修改 isp lis this 阅读 http
public abstract class AbstractClass { protected abstract void doAnything(); protected abstract void doSomething(); public final void templateMethod(){ /* * 调用基本方法,完成相关的逻辑 */ this.doAnything(); this.doSomething(); } } public class ConcreteClass1 extends AbstractClass { @Override protected void doAnything() { // TODO Auto-generated method stub //子类实现具体 } @Override protected void doSomething() { // TODO Auto-generated method stub } } public class ConcreteClass2 extends AbstractClass { @Override protected void doAnything() { // TODO Auto-generated method stub //子类实现具体 } @Override protected void doSomething() { // TODO Auto-generated method stub } }
如上通用类图中,若在ConcreteClass2中不想执行doSomething()方法,那么需要对模板方法做一些修改,其通用类图如下:
public abstract class AbstractClass { protected abstract void doAnything(); protected abstract void doSomething(); protected boolean isDoSomething(){ //父类方法返回真 return true; } public final void templateMethod(){ /* * 调用基本方法,完成相关的逻辑 */ this.doAnything(); if(this.isDoSomething()) this.doSomething(); } } public class ConcreteClass1 extends AbstractClass { private boolean isDoSth; @Override protected void doAnything() { // TODO Auto-generated method stub //子类实现具体 } @Override protected void doSomething() { // TODO Auto-generated method stub } protected void setDo(boolean isDo){ this.isDoSth = isDo; } protected boolean isDoSomething(){ return isDoSth; } }
模板方法模式是通过父类建立框架,子类在重写了父类部分方法之后,在调用从父类继承的方法,产生不同的效果,通过修改子类,影响父类行为的结果,模板方法在一些开源框架中应用非常多,它提供了一个抽象类,然后开源框架写了一堆子类,如果需要扩展功能,可以继承此抽象类,然后覆写protected基本方法,然后在调用一个类似TemplateMethod()的模板方法,完成扩展开发。
标签:any play 优点 修改 isp lis this 阅读 http
原文地址:http://www.cnblogs.com/zhanglei93/p/6021086.html