设计模式入门:模板方法模式

个人公众号【爱做梦的锤子】,全网同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,欢迎关注,里面会分享更多有用知识,还有我的私密照片

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值