模板方法模式(Template Method)
2015-06-27 09:22
323 查看
模板方法模式,定义一个操作中的算法的骨架,而将步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤。
就是指:一个抽象类中,有一个主方法,再定义1...n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用。
看下面的例子,在AbstractCalculator类中定义一个主方法calculate,calculate()调用spilt()等,Plus和Minus 分别继承AbstractCalculator类,通过对AbstractCalculator的调用实现对子类的调用。
适用性
1.一次性实现一个算法的不变的部分,并将可变的部分留给子类来实现。
2.各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用几个调用这些新的操作的模板方法来替换这些不同的代码。
3.控制子类扩展。
就是指:一个抽象类中,有一个主方法,再定义1...n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用。
看下面的例子,在AbstractCalculator类中定义一个主方法calculate,calculate()调用spilt()等,Plus和Minus 分别继承AbstractCalculator类,通过对AbstractCalculator的调用实现对子类的调用。
public abstract class AbstractCalculator { /*主方法,实现对本类其它方法的调用*/ public final int work(String exp,String opt){ int array[] = split(exp,opt); return calculate(array[0],array[1]); } /*被子类重写的方法, Template Method */ public abstract 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; } }
public class Plus extends AbstractCalculator { @Override public int calculate(int num1,int num2) { return num1 + num2; } }测试类:
public class StrategyTest { public static void main(String[] args) { String exp = "8+8"; AbstractCalculator cal = new Plus(); int result = cal.work(exp, "\\+"); System.out.println(result); } }跟踪下这个小程序的执行过程:首先将exp和"\\+"做参数,调用AbstractCalculator类里的work(String,String)方法,在work(String,String)里调用同类的split(),之后再调用 calculate(int ,int)方法,从这个方法进入到子类中,执行完return num1 + num2后,将值返回到AbstractCalculator类,赋给result,打印出来。
适用性
1.一次性实现一个算法的不变的部分,并将可变的部分留给子类来实现。
2.各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用几个调用这些新的操作的模板方法来替换这些不同的代码。
3.控制子类扩展。
相关文章推荐
- gem install bundler
- Struts2返回JSON对象总结
- SVM样本训练步骤
- 粉碎机项目相关知识点
- helloworld
- 【Hibernate】Hibernate的多表查询
- 石灰墙上的这种污渍怎么去掉?黑色灰色的
- 对那些想写个网络音乐播放器、电台玩玩的同学提供一些原料
- 认识自己——恐惧的奴隶:动物
- CSS3动画-动画
- SED命令详解
- cURL使用教程及实例演示
- 远程通信(RPC,Webservice,RMI,JMS、EJB、JNDI的区别)对比
- 远程通信(RPC,Webservice,RMI,JMS、EJB、JNDI的区别)对比
- android Unable to execute dex问题的解决
- 面向对象的5条基本设计原则
- php 缓存工具类 实现网页缓存
- ueditor 长文章分页
- 创建静态库FrameWork(特别创建)
- 将两首音乐合成一首