模板方法模式就是在定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现,模板方法可以使不改变算法结构的情况下,重新定义算法的某些步骤.
举例理解:
如果你想做俩道菜,第一步都是放入油烧热,第二步是加入青菜或是茄子,第三步都是放入盐等调味料,第四步都是出锅.在其中除了第二步不同其他的都是一样的,将相同的定义在基类,而第二步就是需要根据差异在具体的类中进行实现.
实现
代码实现:
package com.heiheihei.pojo;
/**
* @author 嘿嘿嘿1212
* @version 1.0
* @date 2020/2/21 21:13
* 基类
*/
public abstract class BaseCooking {
public void makeCooking() {
oil();
greens();
addCondiments();
serveTheDishes();
}
public void oil() {
System.out.println("起锅烧油");
}
/**
* 放入菜品
*/
public abstract void greens();
public void addCondiments() {
System.out.println("加入调味料");
}
public void serveTheDishes() {
System.out.println("上菜咯");
}
}
package com.heiheihei.pojo;
/**
* @author 嘿嘿嘿1212
* @version 1.0
* @date 2020/2/21 21:22
* 青菜类
*/
public class Greens extends BaseCooking {
@Override
public void greens() {
System.out.println("向锅中加入青菜叶");
}
}
package com.heiheihei.pojo;
/**
* @author 嘿嘿嘿1212
* @version 1.0
* @date 2020/2/21 21:24
* 茄子类
*/
public class Eggplant extends BaseCooking {
@Override
public void greens() {
System.out.println("向锅中加入茄子");
}
}
package com.heiheihei.pojo;
/**
* @author 嘿嘿嘿1212
* @version 1.0
* @date 2020/2/21 21:26
* 测试类
*/
public class BaseCookingTest {
public static void main(String[] args) {
System.out.println("准备炒青菜");
BaseCooking greens = new Greens();
greens.makeCooking();
System.out.println("准备炒茄子");
BaseCooking eggplant = new Eggplant();
eggplant.makeCooking();
System.out.println("准备吃饭了");
}
}
结果:
主要原理是对父类的方法进行重写,在调用父类方法时使用子类重写的方法与继承的基类方法进行执行.
优点
- 将相同部分的代码,放入抽象父类中,提供代码的扩展性和复用性
缺点
- 增加了类的数量,耦合度增高了