个人公众号【爱做梦的锤子】,全网同id,个站 http://te-amo.site,欢迎关注,里面会分享更多有用知识,还有我的私密照片
模板方法模式就是定义一个算法的骨架,而将具体的算法延迟到子类中实现
场景:系统中有个创建资源的功能,分为四步:创建资源,上传到FTP服务器,保存到数据库,清理本地缓存。可以创建图片类型资源和文本类型资源,这样一来思考一下,其实就是创建的过程不同,而上传、保存,清理都是相同的算法处理,所以可以使用模板方法模式
结构
- 抽象类:实现了模板方法,定义了算法的骨架。(ResourceTemplate)
- 具体类:实现抽象类中的抽象方法,实现完整的算法。(ImgResource,TextResource)
设计
实现
代码地址:https://github.com/telundusiji/designpattern
资源创建的模板
@Slf4j
@Data
public abstract class ResourceTemplate {
private String type;
protected abstract void create();
private final void uploadToFTP(){
String serverHost = null;
if("text".equals(type)){
serverHost = "text.ftp.xxxx.com";
}else if("img".equals(type)){
serverHost = "img.ftp.xxxx.com";
}else {
throw new RuntimeException();
}
log.info("上传到FTP服务器({})成功!",serverHost);
}
private final void saveToDB(){
log.info("保存到数据库成功!");
}
private final void clean(){
log.info("清理本地缓存成功!");
}
public final void execute(){
create();
uploadToFTP();
saveToDB();
clean();
}
}
图像类型资源创建
@Slf4j
public class ImgResource extends ResourceTemplate {
@Override
public void create() {
setType();
log.info("创建text资源!");
}
public void setType(){
super.setType("img");
}
}
文本类型资源创建
@Slf4j
public class TextResource extends ResourceTemplate {
@Override
public void create() {
setType();
log.info("创建text资源!");
}
public void setType(){
super.setType("text");
}
}
优缺点
优点:
- 把不变的行为搬移到超类,变化的行为由子类自行扩展,有助于算法的扩展。
缺点:
- 每个不同的实现都需要定义一个子类,当子类数量庞大时,如果超类的骨架需要变动时,子类都需要修改。
个人公众号【爱做梦的锤子】,全网同id,个站 http://te-amo.site,欢迎关注,里面会分享更多有用知识,还有我的私密照片