模板方法设计模式
该设计模式解决的问题是:具有固定算法(步骤)的应用。但这些算法步骤,又针对不同的用户(情况)具有不同的实现方式。
在该设计模式中,具有两大类方法:模板方法,步骤方法。
步骤方法又根据其实现情况,分为三种:抽象方法、最终方法、钩子方法。
抽象方法:要求子类必须要实现的方法。
最终方法:由final修饰的方法,不能被子类重写的方法。
钩子方法:具有默认的实现,但可以被子类重写的方法。
一: 设计模板类
1 public abstract class DinnerSever { 2 //模板方法 3 public void havingDinner(){ 4 //点餐 5 order(); 6 //进餐 7 eat(); 8 //z支付 9 pay(); 10 } 11 //不同的人支付方式不同,但有默认方式现金支付 12 //后边可继承该类并重写该方法..改为其他方式 13 //默认方法 14 public void pay() { 15 System.out.println("正在使用现金支付....."); 16 } 17 //不同点餐吃的方式不同.....此处应该定义为abstract 18 //抽象方法、 19 public abstract void eat(); 20 //点餐只能使用ipad.....此方法为唯一且不可变得,用final修饰 21 //最终方法 22 public final void order() { 23 // TODO Auto-generated method stub 24 System.out.println("只能使用ipad点餐....."); 25 // System.out.println("此方法为底层模板不可变....."); 26 } 27 }
二..定义类实现该模板
例:模板使用
1 //中餐服务 2 public class China extends DinnerSever { 3 4 @Override 5 //实现抽象方法 6 public void eat() { 7 // TODO Auto-generated method stub 8 System.out.println("来一碗面条....."); 9 } 10 //重写默认方法 11 @Override 12 public void pay() { 13 System.out.println("中国人可以使用支付宝...微信支付"); 14 } 15 }
模板使用:
1 public class English extends DinnerSever{
public class Demo { public static void main(String[] args) { China ca = new China();//实现对象 English eg = new English(); ca.havingDinner(); //执行方法 eg.havingDinner(); } }
2 //都需要重新eat方法.. 3 @Override 4 public void eat() { 5 // TODO Auto-generated method stub 6 System.out.println("外国人吃西餐.."); 7 } 8 //默认使用现金支付...此处可以不写 9 /*@Override 10 public void pay() { 11 // TODO Auto-generated method stub 12 System.out.println("使用"); 13 }*/ 14 15 }
三:测试...
over