设计模式之模板方法


模板方法模式,兄弟连兄弟会 www.itxdh.com 企鹅群:499956522 高端人才培养就到【兄弟连兄弟会】纯免费的高端IT人才培养


意图:


定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。


适用性:


一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。


各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。这是Opdyke 和Johnson 所描述过的“重分解以一般化”的一个很好的例子[ OJ93 ]。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。


控制子类扩展。模板方法只在特定点调用“hook ”操作(参见效果一节),这样就只允许在这些点进行扩展。


看下面的例子:


[java] view plaincopy

public abstract class AbstractCalculator {  

      

    /*主方法,实现对本类其它方法的调用*/  

    public final int calculate(String exp,String opt){  

        int array[] = split(exp,opt);  

        return calculate(array[0],array[1]);  

    }  

      

    /*被子类重写的方法*/  

    abstract public int calculate(int num1,int num2);  

      

    public int[] split(String exp,String opt){  

        String array[] = exp.split(opt);  

        int arrayInt[] = new int[2];  

        arrayInt[0] = Integer.parseInt(array[0]);  

        arrayInt[1] = Integer.parseInt(array[1]);  

        return arrayInt;  

    }  

}  

[java] view plaincopy

public class Plus extends AbstractCalculator {  

  

    @Override  

    public int calculate(int num1,int num2) {  

        return num1 + num2;  

    }  

}  

测试类:


[java] view plaincopy

public class StrategyTest {  

  

    public static void main(String[] args) {  

        String exp = "8+8";  

        AbstractCalculator cal = new Plus();  

        int result = cal.calculate(exp, "\\+");  

        System.out.println(result);  

    }  

}  

我跟踪下这个小程序的执行过程:首先将exp和"\\+"做参数,调用AbstractCalculator类里的calculate(String,String)方法,在calculate(String,String)里调用同类的split(),之后再调用calculate(int ,int)方法,从这个方法进入到子类中,执行完return num1 + num2后,将值返回到AbstractCalculator类,赋给result,打印出来。正好验证了我们开头的思路。


转载于:https://my.oschina.net/u/2605164/blog/616519

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值