模板方法模式
(定义一个操作中的算法的框 架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义 该算法的某些特定步骤。)
个人理解:即把公共的东西提取出来封装成一个方法,不同的部分封装成一个抽象方法。子类继承模板类。重写抽象方法即可。
AbstractClass 叫做抽象模板,它的方法分为两类:
● 基本方法 基本方法也叫做基本操作,是由子类实现的方法,并且在模板方法被调用。
● 模板方法 可以有一个或几个,一般是一个具体方法,也就是一个框架,实现对基本方法的调 度,完成固定的逻辑。 注意: 为了防止恶意的操作,一般模板方法都加上 final 关键字,不允许被覆 写。 具体模板:ConcreteClass1 和 ConcreteClass2 属于具体模板,实现父类所定义的 一个或多个抽象方法,也就是父类定义的基本方法在子类中得以实现
使用场景:
● 多个子类有公有的方法,并且逻辑基本相同时。
● 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由 各个子类实现。
● 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然 后通过钩子函数(见“模板方法模式的扩展”)约束其行为。
代码:
1 抽象模板父类
public abstract class ToPay {public abstract void acceptParameter();public abstract void check();public abstract void getPlayUrl();//公共方法public void play() {this.acceptParameter();this.check();this.getPlayUrl();}public abstract void acceptNotify();}
2 子类A
public class WeixinPay extends ToPay {@Overridepublic void acceptParameter() {System.out.println("微信接受参数");}@Overridepublic void check() {System.out.println("微信校验参数");}@Overridepublic void getPlayUrl() {System.out.println("微信支付链接");}@Overridepublic void acceptNotify() {System.out.println("微信提醒");}
}
3 子类B
public class ZhifubaoPly extends ToPay {@Overridepublic void acceptParameter() {System.out.println("支付宝接受参数");}@Overridepublic void check() {System.out.println("支付宝校验参数");}@Overridepublic void getPlayUrl() {System.out.println("支付宝支付链接");}@Overridepublic void acceptNotify() {System.out.println("支付宝提醒");}
}
4 验证
public class TMain {public static void main(String[] args) {WeixinPay wp = new WeixinPay();ZhifubaoPly zp = new ZhifubaoPly();wp.play();zp.play();zp.acceptNotify();}
}
5 结果:
场景:
多个子类的方法重复的清情况下,可以抽出来公共方法。
总结:
优点
1.减少代码的重复性;
2.子类实现算法的某些细节,有助于算法的扩展;
3.通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则“;
缺点
1.每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。