说明:本文介绍设计模式中行为型设计模式中的,模板方法模式;
生存
模版方法模式是行为型设计模式,关注于对象的行为。在《秒懂设计模式》(刘韬 著)中举了一个例子,例如哺乳动物的生存技能,鲸鱼、人类都属于哺乳动物,有吃、动的行为,并依靠这两项行为生存。代码如下:
(Whale,鲸鱼)
/**
* 鲸鱼类
*/
public class Whale {
/**
* 鲸鱼的活动
*/
public void move(){
System.out.println("鲸鱼在游泳");
}
/**
* 鲸鱼的吃
*/
public void eat() {
System.out.println("鲸鱼捕食海洋中的小鱼");
}
/**
* 鲸鱼的生存
*/
public void life() {
move();
eat();
}
}
(Human,人类)
/**
* 人类
*/
public class Human {
/**
* 人类的活动
*/
public void move(){
System.out.println("人类在走路");
}
/**
* 人类的吃
*/
public void eat() {
System.out.println("人类吃饭");
}
/**
* 人类的生存
*/
public void life() {
move();
eat();
}
}
(Client,客户端,模拟流程)
/**
* 客户端
*/
public class Client {
public static void main(String[] args) {
new Whale().life();
System.out.println("===========");
new Human().life();
}
}
(执行程序)
模板方式模式
分析上面的代码,可以看到,鲸鱼、人类生存行为都是依赖于吃、动行为的,是模板化的。所以,可以考虑抽取出一个哺乳动物抽象类,类中有吃、动抽象方法,而对于生存行为,则将其模板化,固定搭配,写在一个final修饰的生存方法中。如下:
(Mammal,哺乳动物抽象类,固定生存模板方法)
/**
* 哺乳动物类
*/
public abstract class Mammal {
/**
* 哺乳动物的活动
*/
public abstract void move();
/**
* 哺乳动物的吃
*/
public abstract void eat();
/**
* 哺乳动物的生存
*/
public final void life() {
move();
eat();
}
}
(Whale,鲸鱼,具体实现类)
/**
* 鲸鱼类
*/
public class Whale extends Mammal{
/**
* 鲸鱼的活动
*/
public void move(){
System.out.println("鲸鱼在游泳");
}
/**
* 鲸鱼的吃
*/
public void eat() {
System.out.println("鲸鱼捕食海洋中的小鱼");
}
}
(Human,人类,具体实现类)
/**
* 人类
*/
public class Human extends Mammal{
/**
* 人类的活动
*/
public void move(){
System.out.println("人类在走路");
}
/**
* 人类的吃
*/
public void eat() {
System.out.println("人类吃饭");
}
}
(Client,客户端,模拟流程)
/**
* 客户端
*/
public class Client {
public static void main(String[] args) {
new Whale().life();
System.out.println("===========");
new Human().life();
}
}
通过模板方法模式,将多个对象中行为的固定组合,从对象中抽取出来放到父类中,简化了代码,同时也统一了子类的方法。
总结
本文参考《设计模式的艺术》、《秒懂设计模式》两书,案例代码与书中的略有不同。