Java设计模式之--模板方法模式(Template Method)
2016-06-21 16:17
776 查看
概念:模板方法模式需要开发抽象类和具体子类的设计师之间的协作。一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则负责给出这个算法的各个逻辑步骤。代表这些具体逻辑步骤的方法称做基本方法(primitive method);而将这些基本方法汇总起来的方法叫做模板方法(template method),这个设计模式的名字就是从此而来。模板方法模式,技术具体是:一个抽象类中,对外主方法另外有n个方法,这些方法,可以是抽象的,也可以是实际的方法,定义子类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用,先看个关系图:抽象类AbstractCalculator 有一个Final修饰的对外主方法,另有一个待子类实现的抽象方法
public abstract class AbstractCalculator { public final int calculate(String exp, String opt) { int array[] = split(exp, opt); return calculate(array); } public int[] split(String exp, String opt) { String array[] = exp.split(opt); int arrayInt[] = new int[array.length]; for (int i = 0; i < array.length; i++) { int iTemp = 0; try { iTemp = Integer.parseInt(array[i]); } catch (Exception e) { e.printStackTrace(); } arrayInt[i] = iTemp; } return arrayInt; } public abstract int calculate(int... num); }
子类实现抽象方法:
public class Plus extends AbstractCalculator { @Override public int calculate(int... num) { int iRes = 0; for (int i = 0; i < num.length; i++) { iRes += num[i]; } return [/b]iRes; } }
public class Minus extends AbstractCalculator { @Override public int calculate(int... num) { int iRes = 0; for (int i = 0; i < num.length; i++) { if (i == 0) { iRes += num[i]; } else { iRes -= num[i]; } } return iRes; } }
测试类:
public class WorkClass { public void test() { StringBuilder exp = new StringBuilder("1+2+3+4"); AbstractCalculator calculator = new Plus(); System.out.println(String.format("%s=%s",exp,calculator.calculate(exp.toString(),"\\+"))); exp.delete(0,exp.length()).append("1-2-3-4"); calculator= new Minus(); System.out.println(String.format("%s=%s",exp,calculator.calculate(exp.toString(),"\\-"))); } }
测试结果:
06-21 16:54:05.348 8253-8253/com.example.qinghua_liu.myapplication I/System.out: 1+2+3+4=1006-21 16:54:05.350 8253-8253/com.example.qinghua_liu.myapplication I/System.out: 1-2-3-4=-8结语:客户成功通过对AbstractCalculator的调用实现对子类具体实现方法的调用。
相关文章推荐
- PostgreSQL教程(三):表的继承和分区表详解
- Lua面向对象之类和继承浅析
- 浅析Ruby中继承和消息的相关知识
- 设计引导--一个鸭子游戏引发的设计理念(多态,继承,抽象,接口,策略者模式)
- C++实现不能被继承的类实例分析
- C# 面向对象三大特性:封装、继承、多态
- PHP类的封装与继承详解
- js继承 Base类的源码解析
- Javascript 面向对象 继承
- JavaScript 继承使用分析
- Javascript面向对象编程(二) 构造函数的继承
- Javascript中的几种继承方式对比分析
- javascript面向对象之Javascript 继承
- JavaScript 对象、函数和继承
- 详述JavaScript实现继承的几种方式(推荐)
- javascript 继承学习心得总结
- 学习javascript面向对象 javascript实现继承的方式
- 关于JavaScript的面向对象和继承有利新手学习
- javascript 用函数实现继承详解
- JavaScript 继承详解(一)