文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何通过模板模式重构代码?

2024-12-01 20:11

关注

本篇文章给大家介绍日常开发中比较常用的一种设计模式——模板模式。

一、什么是模板模式

Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.

模板方法模式(Template Method Pattern):定义一个操作中的算法的框架, 而将一些步骤延迟到子类中。使得子类可以不改 变一个算法的结构即可重定义该算法的某些特定步骤。

说人话:父类模板方法定义不变的流程,子类重写流程中的方法。

二、模板模式定义

1.AbstractClass 抽象模板

基本方法

上面的 baseOperation() 或者 customOperation() 方法,也叫基本操作,是由子类实现的方法,并且在模板方法中被调用。

基本方法尽量设计为protected类型, 符合迪米特法则, 不需要暴露的属性或方法尽量不要设置为protected类型。实现类若非必要, 尽量不要扩大父类中的访权限。

②模板方法

上面的 templateMethod() 方法,可以有一个或者几个,实现对基本方法的调度,完成固定的逻辑。

为了防止恶意操作,通常模板方法都加上 final 关键字,不允许覆写。

2.ConcreteClass 具体模板

实现父类定义的一个或多个抽象方法,也就是父类定义的基本方法在子类中得以实现。

三、模板模式通用代码

public abstract class AbstractClass {
// 共同的且繁琐的操作
private void baseOperation() {
// do something
}

// 由子类定制的操作
protected abstract void customOperation();

// 模板方法定义的框架
public final void templateMethod() {

baseOperation();
customOperation();
}

}
public class ConcreteClass1 extends AbstractClass{

@Override
protected void customOperation() {
// 具体模板1 业务逻辑
System.out.println("具体模板1:customOperation()");
}
}
public class ConcreteClass2 extends AbstractClass{
@Override
protected void customOperation() {
// 具体模板2 业务逻辑
System.out.println("具体模板2:customOperation()");
}
}

测试:

public class TemplateClient {
public static void main(String[] args) {
AbstractClass abstractClass1 = new ConcreteClass1();
AbstractClass abstractClass2 = new ConcreteClass2();
applyTemplate(abstractClass1);
applyTemplate(abstractClass2);
}

public static void applyTemplate(AbstractClass abstractClass){
abstractClass.templateMethod();
}
}

四、模板模式优点

1.封装不变部分, 扩展可变部分

把认为是不变部分的算法封装到父类实现, 而可变部分的则可以通过继承来继续扩展。

2.提取公共部分代码, 便于维护

3.行为由父类控制, 子类实现

基本方法是由子类实现的, 因此子类可以通过扩展的方式增加相应的功能, 符合开闭原则。

五、模板模式缺点

1.子类执行的结果影响了父类的结果,这和我们平时设计习惯颠倒了,在复杂项目中,会带来阅读上的难度。

2.可能引起子类泛滥和为了继承而继承的问题

六、回调

为了解决模板模式的缺点,我们可以利用回调函数代替子类继承。

public interface Callback {
void customOperation();
}
public class SubCallback implements Callback{
@Override
public void customOperation() {
System.out.println("SubCallback customOperation");
}
}

public final class Template {
private void baseOperation(){
System.out.println("模板类公共操作");
}

public void templateMethod(Callback callback){
baseOperation();
callback.customOperation();
}
}

测试:

public class TemplateClient {
public static void main(String[] args) {
Template template = new Template();
applyTemplate(template);
}

public static void applyTemplate(Template template){
Callback callback = new SubCallback();
template.templateMethod(callback);
}
}

Template是一个稳定的final类,无法被继承,不存在子类行为影响父类结果的问题,而Callback是一个接口,为了继承而继承的问题消失了。

来源:Java技术指北内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯