当前位置: 首页 > news >正文

模版模式和策略模式的区别

前言

模版模式和策略模式在日常开发中经常遇到,这两个设计模式有啥区别,这里简单总结下。

模版模式简单demo

// 抽象模板类
abstract class AbstractClass {// 模板方法定义了算法的骨架public void templateMethod() {// 执行固定的步骤step1();step2();step3();}// 抽象方法,由子类实现具体的步骤protected abstract void step1();protected abstract void step2();// 钩子方法,由子类选择性地实现具体的步骤protected void step3() {// 默认实现}
}// 具体模板类
class ConcreteClass extends AbstractClass {protected void step1() {System.out.println("执行步骤1");}protected void step2() {System.out.println("执行步骤2");}protected void step3() {System.out.println("执行步骤3");}
}// 客户端代码
public class TemplatePatternExample {public static void main(String[] args) {AbstractClass template = new ConcreteClass();template.templateMethod();}
}

上述例子中,抽象类AbstractClass定义了算法的骨架,通过templateMethod方法控制算法的整体流程,每个具体的步骤由抽象方法和钩子方法定义。具体子类ConcreteClass根据需要实现具体的步骤。客户端通过创建具体子类的实例并调用templateMethod方法来使用模板模式。

策略模式简单demo

// 定义一个接口,表示可互换的算法
interface Strategy {void execute();
}// 实现具体的算法
class ConcreteStrategy1 implements Strategy {public void execute() {System.out.println("执行策略1");}
}// 实现具体的算法
class ConcreteStrategy2 implements Strategy {public void execute() {System.out.println("执行策略2");}
}// 客户端代码
public class StrategyPatternExample {public static void main(String[] args) {// 根据需要选择具体的策略Strategy strategy = new ConcreteStrategy1();// 执行策略strategy.execute();// 切换到另一个策略strategy = new ConcreteStrategy2();// 执行策略strategy.execute();}
}

上述例子中,定义了一个表示可互换的算法的接口Strategy,并实现了两个具体的策略类ConcreteStrategy1和ConcreteStrategy2。客户端根据需要选择并使用不同的策略。通过创建具体策略类的实例并调用execute方法来使用策略模式。

总结

模板模式(Template Pattern)和策略模式(Strategy Pattern)是两种常用的设计模式,它们在解决不同的问题上有一些区别。

  • 模板模式是一种行为设计模式,它定义了一个算法的骨架,将一些步骤的具体实现延迟到子类中。模板模式通过在父类中定义算法的骨架然后使用抽象方法暴露可变部分,使得子类可以根据自身需求实现具体的步骤。这种方式可以确保算法的结构不变,但允许特定步骤的自定义实现。
  • 策略模式也是一种行为设计模式,它定义了一组可以相互替换的算法,并使得这些算法可以独立于使用算法的客户而变化。策略模式将每个算法封装在不同的类中,并允许客户端根据需要选择要使用的算法。这种方式将算法的选择和使用与具体算法的实现分离开来,提供了更高的灵活性和可扩展性。

总结来说,模板模式侧重于使用继承来实现算法的骨架,并允许子类实现具体的步骤,而策略模式侧重于使用组合来选择和使用不同的算法实现。模板模式在父类中定义了算法的骨架,子类只负责实现具体的步骤,而策略模式将算法的选择和使用完全交给了客户端。

http://www.lryc.cn/news/97561.html

相关文章:

  • Github搭建个人博客全攻略
  • gensim conherence model C_V 值与其他指标负相关BUG
  • QT DAY3
  • TortoiseGit(小乌龟)使用问题总结
  • 106、Redis和Mysql如何保证数据一致
  • SpringBoot+jasypt-spring-boot-starter实现配置文件明文加密
  • k8s核心概念
  • opencv 处理的视频 保存为新视频 ,新视频 无法读取
  • 《golang设计模式》第一部分·创建型模式-02-原型模式(Prototype)
  • SpringCloudAlibaba微服务实战系列(一)Nacos服务注册发现
  • 23.7.27 牛客暑期多校4部分题解
  • Ubuntu 20.04 安装教程
  • 如何评判算法好坏?复杂度深度解析
  • 【HashMap】2352. 相等行列对
  • 如何声明静态方法 和 实现?
  • 哈工大计算机网络课程局域网详解之:无线局域网
  • 系统集成|第六章(笔记)
  • MySQL主从复制环境部署
  • day42-servlet下拉查询/单例模式
  • docker中设置容器健康检查
  • azure-cognitiveservices-speech api error while using with AWS Lambda
  • 系统集成项目管理工程师挣值分析笔记大全
  • TCP 协议【传输层协议】
  • Golang 中的 time 包详解(二):time.Duration
  • Linux 学习记录58(ARM篇)
  • 【一文搞懂】—带霍尔编码器的直流有刷减速电机
  • 滴水逆向三期笔记与作业——02C语言——05 正向基础/05 循环语句
  • Python抓取分享页面的源代码示例
  • linux安装nginx遇到的报错
  • 一起学SF框架系列5.8-spring-Beans-Bean注解解析3-解析配置component-scan