概念
模板模式就是通过一个模板定义一些方法,然后再根据这个模板具体实现一些特定的功能。模板的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
实现
案例:某一玩具工厂要开始生产玩具,做生产的总得有的方案吧,或者说总得按照某一个模板进行生产吧。某玩具工厂制作玩具娃娃的基础设计模板,这个模板必须配备两个功能,一个是发出声音,一个是会做动作,这样才能配合小孩子玩耍:
代码如下:
/**
* 定义一个玩具娃娃的抽象类,相当于一个模板
*/
public abstract class Doll {
//定义一个发出响声的方法
public abstract void cry();
//定义一个表示娃娃的动作的方法
public abstract void behavior();
//定义玩具娃娃是怎么跟主人玩耍的
public void play(){
cry();
behavior();
}
}
可是单单只是这样,哪能吸引小朋友的眼光呢,可能还得有个造型,根据这个造型,具体实现模板中的功能,著名的设计师ctb拿着这个模板,晚上去进行加工和修改想出了两套方案:
方案一:
/**
* 定义一个狗的类,具体实现玩具娃娃的抽象方法
*/
public class DogDoll extends Doll {
@Override
public void cry() {
System.out.print("汪汪汪 ");
}
@Override
public void behavior() {
System.out.print("握手手");
}
}
方案二:
/**
* 定义一个猫娃娃的类,具体实现玩具娃娃
*/
public class CatDoll extends Doll {
@Override
public void cry() {
System.out.print("喵喵喵 ");
}
@Override
public void behavior() {
System.out.print("摇尾巴");
}
}
第二天,ctb给老板看了两套方案,老板十分满意,觉得公司要大赚了,但是经理小明说,这关看方案不行啊,还得看做出来的效果如何,于是我们来到工厂进行测试:
public class Factory {
public static void main(String[] args) {
//通过玩具模板,定义玩具猫
Doll cat = new CatDoll();
//通过玩具模板,定义玩具狗
Doll dog = new DogDoll();
System.out.print("我是玩具猫,我会");
cat.play();
System.out.println();
System.out.print("我是玩具狗,我会");
dog.play();
}
}
实验结果:
优点:通过提取公共的部分进行封装,然后再让子类进行实现,减少代码冗余,增加代码可读性,便于维护
缺点:当如果要实现的子类过多时,需要写的类就会很多,使系统更加庞大
本文的代码:https://pan.baidu.com/s/1A52ZMyYE1p7zTLLsg-2R_A
提取码:fifq