java设计模式:模板方法模式

来源:互联网 发布:格灵深瞳怎么样 知乎 编辑:程序博客网 时间:2024/05/22 03:50

模板方法模式

在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。


实现要素:

准备一个抽象类,将部分逻辑以具体方法的形式实现,然后声明一些抽象方法交由子类实现剩余逻辑,有钩子方法给予子类更大的灵活性,最后将方法汇总成一个不可改变的模板方法。

使用场景:

 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。

应用实例: 

1、在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异。 2、西游记里面菩萨定好的 81 难,这就是一个顶层的逻辑骨架。 3、spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。


注意事项:

为防止恶意操作,一般模板方法都加上 final 关键词。


抽象基类:

//抽象基类,为所有子类提供一个算法框架//饮料类public abstract class Beverage {//模板方法//封装了所有子类共同遵循的算法框架//final:禁止子类重写public final void prepareBeverage(){//1.将水煮沸boilWater();//2.泡制饮料brew();//3.将饮料倒入杯中pourInCup();//4.加入调味料if(isyouWantsCondiments()){addCondiments();}}//Hook,钩子函数,提供一个默认或空的实现//具体的子类可以自行决定是否挂钩以及如何挂钩//询问用户是否加入调料protected boolean isyouWantsCondiments(){return true;}//为让子类可见,权限改为protectedprotected abstract void addCondiments();//基本方法private void pourInCup() {System.out.println("将饮料倒入杯中");}protected abstract void brew();//基本方法,将水煮沸private void boilWater() {System.out.println("将水煮沸");}}


子类:

public class Coffee extends Beverage {@Overrideprotected void addCondiments() {System.out.println("加入糖和牛奶");}@Overrideprotected void brew() {System.out.println("用沸水冲泡咖啡");}}

public class Tea extends Beverage {@Overrideprotected void addCondiments() {System.out.println("加入柠檬");}@Overrideprotected void brew() {System.out.println("用80度开水泡5分钟");}//子类通过覆盖的形式选择挂载钩子函数protected boolean isyouWantsCondiments(){return false;}}


测试类

public class Test {public static void main(String[] args) {System.out.println("制作咖啡");Beverage b1=new Coffee();b1.prepareBeverage();System.out.println("*******************************");System.out.println("制作茶");Beverage b2=new Tea();b2.prepareBeverage();}}




原创粉丝点击