模版方法模式,实际上就是指子类做方法实现,父类做算法实现。
通常情况下,子类继承父类,我们是站在子类的视角上来看父类的,目的不外乎下面三个
- 1,子类继承父类的方法
- 2,通过子类来增加方法,实现新的功能
- 3,子类重写父类方法,来改变程序的行为
今天,我们站在父类的角度俩看待这个问题,我们声明了抽象方法,并将抽象方法来交给子类实现,,所以,父类的要求就是如下
- 1,要求子类实现抽象方法
从父类的角度来看,这就是模版工厂方法。
下面举个例子,比如说手机有一个功能,就是打电话,用软件工程的属于来说,这是一个算法,,这个算法包括三个步骤,拨号,通话,挂断这三个,但是不同的厂家对这三个方法的实现不一样,比如说
老式诺基亚
- 拨号->按键盘的数字键
- 通话->按通话键
- 挂断->按挂断键
iphone
- 拨号->触屏拨号
- 通话->点击触屏通话键
- 挂断->点击触屏挂断键
金立语音王。。。。
- 拨号+通话+挂断->声控,给张总打电话
尽管不同的厂家的实现方法不一样,但是最后这个算法是电话来定的,也就是拨号,通话,挂断,也就是说各个厂家给不同的实现(即拨号,通话,挂断的实现方法),而手机则规定同一的算法(打电话,算法给先拨号,后通话,最后挂断)。到这里,这个模版方法基本上了解了吧,就是子类实现父类的抽象方法,而父类指定算法,这个算法不能更改。
好了,上面的叙述完了,下面就是具体的代码了
父类,规定子类的要实现的方法和自己的算法
package templatemethod; public abstract class AbstractDisplay { //方法 public abstract void open(); public abstract void begin(); public abstract void close(); //算法 public final void display(){ open(); for(int i=0;i<5;i++){ begin(); } close(); } }
子类,实现父类的要实现的方法
package templatemethod; public class CharDisplay extends AbstractDisplay { private String displaystr; public String getDisplaystr() { return displaystr; } public void setDisplaystr(String displaystr) { this.displaystr = displaystr; } public CharDisplay(String str){ this.displaystr = str; } @Override public void open() { System.out.println("******this is chardisplay***********"); } @Override public void begin() { System.out.println(this.displaystr); } @Override public void close() { System.out.println("******this is end***********"); } }
测试类
package templatemethod; public class test { public static void main(String[] args) { AbstractDisplay ad = new CharDisplay("hello, world"); ad.display(); } }